为什么要使用索引?
我们可以将索引理解为书的目录,通过索引可以使查询效率更高。
主键默认是添加索引的。
什么是索引?
索引是帮助 MySql 高效获取数据的
数据结构
。
例如:主键 。 主键会默认添加索引。
主键维护在一个 B+ 树中,保持这条记录的物理地址。
索引的优劣势
优势:
- 提高了查询效率(有 B+ 数排序,把索引数据加载到内存中),减少了 IO 次数。
- 索引使用 B+ 树结构,是有序的,排序是比较快捷方便,减少了CPU 的消耗。
劣势:
- 索引需要空间来存储和维护
- 执行新增、修改、删除操作时,需要对索引进行结构的更新
添加索引的原则
1.哪些情况适合建立索引?
- 主键:默认添加唯一索引
- 作为查询条件的列
- 作为外键关联的列
- 排序的列
- 分组的列
2.哪些情况不适合添加索引?
- 表记录很少的(例如系统参数设置表)
- 不作为查询条件的列
- 增删改较为频繁的表,最好为需要的列来添加
- 数据重复度较高的(如性别)
索引分类
-
主键索引
primary key 主键列自动会添加索引 -
单值索引/单列索引
一个索引对应一个列 -
唯一索引
列的值是唯一性的 -
组合索引
一个索引中包含多个列 -
组合索引最左前缀原则
例如:a、b、c 3列,a、b 列创建了组合索引,在查询时,必须要满足最左侧索引原则,否则索引失效。(最左侧索引原则:在使用组合索引时,最左侧的列必须被使用到,否则索引失效) -
全文索引
mysql 8 之后 innodb 引擎开始支持全文索引,使用全文索引可以代替 like 实现模糊查询,索引不会失效。
mysql 索引的数据结构
mysql 索引使用 B+ 树结构存储索引
B+ 树是有序的,每个节点可以存储多个数据(横向扩展)
非叶子节点不存储数据,只存储索引,一个节点中就可以存储多个索引
所有的数据存储在叶子节点中,每个叶子节点之间有指针指向
使用索引有序的节省了排序时间,一个节点中可以存储多个元素,从而使树高度降低了,并且叶子节点之间有指针,便于区间范围查询。
聚簇索引和非聚簇索引
聚簇索引:找到索引就找到了数据。
例如:innodb 引擎。索引和数据在同一个文件中,找到索引也就可以找到数据。(使用主键作为条件进行查询;如果使用其他列进行查询的话,查询的结果就只有自己)
非聚簇索引:找到了索引以后,还需要回表查询。
例如:myisam 引擎。索引和数据不在同一个文件中,找到索引后,就要去存储数据的文件中查找数据。
innodb 非聚簇:使用其他列作为条件进行查询,查询结果除了本列以外还有其他列的内容,这种情况就需要通过该列先查询到主键,然后通过主键再次回表查询数据。