了解索引之前,首先想一下,为什么有索引?索引作用不是为了查询数据,而是为了快速的查询数据。那么索引是怎么实现快速的查询呢?这就必须要了解一些数据结构的问题。
索引从概念上讲类似字典
索引的数据结构:哈希表、有序数组、搜索树
hash表=数组+链表 通过hash函数计算得出数组中的位置,如果hash出的值冲突,则在数组位置加挂链表
二叉树:索引不止存在内存中,还要写入磁盘中。数据库在设计之初就将每个节点存储在一个的数据页中。因此当数据两超过百万时,2的10次方1024,2的20次方100多万。一次查询的数据可能存储在第20个数据页中。此处可以参考:MySQL索引背后的数据结构及算法原理
因此为了减少数据查询的io次数,需要二叉树分出更多的枝杈以降低树的高度。这里就不得不了解B树与B+树的一些基本概念。B树与B+树
mysql的底层数据结构是在存储引擎中实现的,本文以Inodb为例分析索引的原理和索引优化。
这里假设我已经明白B+树的原理,那么索引如何优化呢?我们最开始想要的是提升查询的效率。B+树因为减少磁盘IO和避免多次递归,而提升了查询效率。
既然通过数据结构已经提升了数据查询的效率了,那索引在其中有什么作用?
回顾数据结构我发现,数据结构解决的是单个数据的快速查询。但我们查询数据是查的一堆数据。好的,现在答案就清晰了,索引就是数据结构里的那个数据。
那么现在我们分析怎么才能让索引更好的服务数据结构,索引的设计与数据结构越匹配,查询越高效。
首先说明一下索引的分类,在INoDB中索引按在数据结构中作用分为主键索引也称聚簇索引(主键索引的叶子节点连接的行数据)和其他索引(叶子节点连接的是主键值)。
首先索引值如果可以排序那是最好不过了,这也是官方建议表使用自增主键的原因。
索引设置的标准:
索引覆盖:可以防止回表
最左匹配:可以防止索引过多
索引失效场景:索引字段上使用函数
索引按照使用不同的可分为:联合索引,唯一索引,普通索引。
唯一索引与普通索引的区别?
结论: