索引是要存储在硬盘中的,磁盘的I/O操作相比于内存来说时间消耗要高的。
所以一次查询,应该要尽量减少磁盘I/O的次数!
二叉查找树(Binary Search Tree)的局限性
二叉搜索树的特点:父节点左子数的所有节点都小于父节点,右子树所有节点都大于父节点
查询的时间复杂度为O(log(N))
如果用二叉树作为索引的实现结构,会让树变得很高,增加硬盘的 I/O 次数,影响数据查询的时间。
InnoDB的索引结构:B+树
- 非叶子节点仅用于索引,不保存数据记录,跟记录有关的信息都放在叶子节点中。
- 叶子节点本身按照关键字的大小从小到大顺序链接。
相比于B树的优势
- 叶子节点不保存数据记录在磁盘页大小相同的情况下,B+树的高度更矮,磁盘操作更少
- 范围查询更方便,叶子节点有序
聚簇索引和非聚簇索引
- 聚簇索引:叶子节点存储的是数据记录
- 非聚簇索引:叶子几点存储的是主键的值
非聚簇索引是有单独空间来存储的,在使用非聚簇索引来查找时,先查找到主键的值,再去主键索引的树上去获取数据。
覆盖索引:可以通过索引即可查询到所有记录,不需要回表到聚簇索引
联合索引的创建原则:ESR
- 精确(Equal)匹配的字段放最前面
- 排序(Sort)条件放中间
- 范围(Range)匹配的字段放最后面
创建索引的情况
- 频繁作为 WHERE 查询条件的字段
- 需要 GROUP BY 和 ORDER BY 的列
- 表连接字段
索引失效的情况
- 索引使用了表达式计算
- 索引使用了函数
- WHERE 子句中,如果在 OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效
- 模糊查询以%开始
- 使用联合索引注意最佳左前缀原则