1、哪些情况需要创建索引
1. 频繁出现在where 条件字段,order排序,group by分组字段
2. select 频繁查询的列,考虑是否需要创建联合索引(覆盖索引,不回表)
3. 多表join关联查询,on字段两边的字段都要创建索引
2、索引优化建议
1. 表记录很少不需创建索引 (索引是要有存储的开销).
2. 一个表的索引个数不能过多。
(1) 空间:浪费空间。每个索引都是一个索引树,占据大量的磁盘空间。
(2) 时间:
更新(插入/Delete/Update)变慢。需要更新所有的索引树。 太多的索引也会增加优化器的选择时间。
所以索引虽然能够提高查询效率,索引并不是越多越好,应该只为需要的列创建索引。
3. 频繁更新的字段不建议作为索引。
频繁更新的字段引发频繁的页分裂和页合并,性能消耗比较高。
4. 区分度低的字段,不建议建索引。
比如性别,男,女;比如状态。区分度太低时,会导致扫描行数过多,再加上回表查询的消耗。 如果使用索引,比全表扫描的性能还要差。这些字段一般会用在组合索引中。
姓名,手机号就非常适合建索引。
5. 在InnoDB存储引擎中,主键索引建议使用自增的长整型,避免使用很长的字段。
主键索引树一个页节点是16K,主键字段越长,一个页可存储的数据量就会越少,比较臃肿,查 询时尤其是区间查询时磁盘IO次数会增多。辅助索引树上叶子节点存储的数据是主键值,主键值越 长,一个页可存储的数据量就会越少,查询时磁盘IO次数会增多,查询效率会降低。
6. 不建议用无序的值作为索引。例如身份证、UUID
更新数据时会发生频繁的页分裂,页内数据不紧凑,浪费磁盘空间。
7. 尽量创建组合索引,而不是单列索引。优点:
(1)1个组合索引等同于多个索引效果,节省空间。
(2)可以使用覆盖索引
创建原则:组合索引应该把把频繁的列,区分度高的值放在前面。频繁使用代表索引的利用率高, 区分度高代表筛选粒度大,可以尽量缩小筛选范围。