概述

经过 上一章对索引的认识再谈mysql索引优化是很必要的, 索引的优化必须对B+Tree有着深刻的认识才能谈优化

什么时候加索引

  • 频繁作为where条件后面的字段
  • 需要对字段进行 group by , order by
  • DISTINCT 需要创建索引
  • 多表连接时需要创建索引, 注意, 不要超过3张因为 相当于 n 个for循环, 每多连接一次相当于加一次for循环; 多表连接是需要 类型一致(否则会自动类型转换导致索引失效) , 需要添加 where过滤条件, 否则数据量非常庞大;
  • 使用类型长度小的创建索引
  • 使用字符串前缀创建索引
  • 区分度高(散列性高)的列适合作为索引
  • 使用最频繁的列放到联合索引的左侧
  • 多个 where条件 联合索引优于单个索引, 只能使用一个索引查询B+Tree;
  • 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建索引,根据实际文本区分度决定索引长度; 索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会 高达 90% 以上 ,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。 此值越接近1 越好;

什么时候不加索引

  • 在where中使用不到的字段,不要设置索引
  • 数据量小的表最好不要使用索引 会拖慢查询速度 或者优化器直接优化掉了;
  • 有大量重复数据的列上不要建立索引, 数据重复度大,比如高于 10%的时候,也不需要对这个字段使用索引;
  • 避免对经常更新的表创建过多的索引;
  • 不建议用无序的值作为索引, 插入数据会导致索引页分裂 重新排序等;
  • 删除不再使用或者很少使用的索引;
  • 不要定义冗余或重复的索引;