索引类别

  • 按照数据结构分类:B+树索引,哈希索引,Full-text索引
  • 按照物理存储分类:聚簇索引(主键索引,数据存储在叶节点),二级索引(辅助索引,叶节点只存储主键)
  • 按照字段特性分类:主键索引(对主键进行索引,只有一个),唯一索引(索引的列值不能重复,不是说只能有一个索引),普通索引,前缀索引(字符串,二进制等对前面几个进行索引,需要设定长度)
  • 按照字段个数分类:单列索引(对某一列进行索引),联合索引(对多个字段索引,会从左往右进行匹配)

回表:由于二级索引叶节点只存储了主键,所以通过二级索引树找到的数据不够的话,还需要通过主键在聚簇索引来寻找。这个称之为回表

索引覆盖:如果只需要获取二级索引的列信息和主键信息,那么可以在二级索引中直接找到,就不需要回表了,这个称之为索引覆盖。

PSMyISAM引擎只保存着数据的物理地址,不保存数据。

索引失效

  • 模糊匹配:如果对字符串等进行了索引,但是它们是从头往后比较的,在模糊索引的时候,如果前面的不确定,那么就没法用到索引树了,如果前面的确定了,那么还可以用索引树来找到一部分。
  • 对索引使用函数:对索引直接使用函数,会导致索引失效,除非专门对这个函数新建了一个索引
  • 对索引进行隐式转换:Mysql会自动将字符串转换成数字,如果对字符串建立了索引,但是用来跟数字比较的话,那么索引就失效了
  • 对索引进行表达式计算:即使这个表达式很容易算出值,Mysql也不会对这个表达式进行计算,索引也会失效
  • 联合索引不满足最左匹配原则:联合索引时,没有按照建立的顺序进行查找,这是因为,假如设定了(a,b,c)三个列联合索引,那么需要先保证a有序,在a的基础上保证b有序,然后继续保证c有序,所以只有a是全局有序,其他是局部有序。
  • 使用or:如果一个where子句,有没建立索引的字段,那么就会索引失效。

总结

img