索引分类

按数据结构分类

  • B+Tree索引
  • Hash索引
  • Full-Text索引

按物理存储分类

  • 聚簇索引
  • 二级索引

按字段特征分类

  • 主键索引
  • 唯一索引

按字段个数分类

  • 单列索引
  • 联合索引

什么时候不需要用索引

索引的优化方法

  • 前缀索引优化 含义: 前缀索引即使用某个字段中字符串的前几个字符建立索引。 优点: 前缀索引可以减小索引字段大小,增加一个索引页中存储的索引值,提高索引的查询速度。 局限性: order by 无法使用前缀索引,无法把前缀索引用作覆盖索引
  • 覆盖索引优化 含义: 覆盖索引是指SQL中query的所有字段,在索引B+Tree的叶子节点上都能找得到的那些索引,从二级索引中查询得到记录,而不需要通过聚簇索引查询获得,可以避免回表的操作。
  • 主键索引最好自增 主键索引为自增,在插入是是顺序插入即在已经数据结构的后方拓展,如果主键索引不为自增,则会产生随机插入的情况,即插入到已经的数据结构中,这时候就需要移动其他数据来满足插入新数据的需求。严重的甚至会产生页分裂即将数据从一个页复制到另一个页中。
  • 索引最好设置为NOT NULL
  • 防止索引失效

防止索引失效

索引失效情况列举

  • 对索引使用左或者左右模糊匹配 当我们使用 like %xxx或者 like %xx% 这两种方式都会造成索引失效
  • 对索引使用函数 如: select * from t_user where length(name)=6;
  • 对索引进行表达式计算 如: explain select * from t_user where id + 1 = 10;
  • 对索引隐式类型转换 如: select “10” > 9
  • 联合索引非最左匹配
  • Where子句中使用OR 如果在OR前的条件列是索引列,而在OR后的条件不是索引列,那么索引失效。