如何正确高效使用mysql数据库的索引--索引优化策略

如何正确高效使用mysql数据库的索引

    • 1. 索引列上不能是使用表达式或函数
    • 2. 前缀索引和索引列的选择性
    • 3. 联合索引
    • 4. 覆盖索引
    • 5. 使用索引扫描来优化排序
    • 6. 删除重复和冗余的索引
    • 7. 更新索引统计信息及减少索引碎片
    • 8.相关文章

1. 索引列上不能是使用表达式或函数

例:

  • 索引列:out_date
  • 查询:select … from product where to_days(out_date) - to_days(current_date) <=30
  • 优化:select … from product where out_date <= date_add(current_date,interval 30 day)

2. 前缀索引和索引列的选择性

  • B-tree索引对键值的大小有限制,Innodb引擎索引键值大小不能超过767个字节,MyISAM引擎索引键值不能超过1000字节,如果字符串长度超过此限制则无法对该列创建索引,即使对不超限制的长字符串能创建索引,查询效率也会受到限制。所以Mysql支持对字符串的前缀创建索引,指定索引列的宽度,这样大大节约索引空间,提高索引的查询效率。
  • 例:CREATE INDEX index_name ON table(col_name(n))。
  • 索引的选择性:索引的选择性是不重复的索引值和表的记录数的比值。索引的选择性越高,使用索引查询的效率就越高。
  • 前缀索引只取了索引列的部分数据,索引的选择性就会降低,所以使用前缀创建索引时,既要控制索引的长度,也要保证索引的选择性不能太差。

3. 联合索引

  • Mysql 5.0以前,每一个查询只能使用一个索引,对于多列的查询条件,并不能使用每一列的索引;在Mysql5.0以后提出了索引合并的概念,在一个查询中可以使用多个列上的独立索引进行合并过滤,但需要更多磁盘I/O和内存来缓存数据,所以这也不是好的优化方式。所以,相比较多个列中创建单独索引,创建联合索引是个好的优化方法。
  • 如何选择联合索引的顺序
    1. 经常会被使用到的列优先,放在联合索引的最左边
    2. 选择性高的列优先,选择性越高,查询效率越快(选择性差的列不适合做索引,比如,性别,只有男,女,可能被Mysql优化器忽略)
    3. 宽度小的列优先,宽度小,占用的内存就小,查询效率就高

4. 覆盖索引

  • 覆盖索引:包含所有需要查询字段的索引就是覆盖索引,所有字段包括select中的字段,where条件中的字段,group by中的字段,order by 中的字段。
  • 优点:
    1. 可以优化缓存,减少磁盘I/O操作
    2. 减少随机I/O,变随机IO为顺序IO
    3. 可以避免对Innodb主键索引的二次查询
    4. 可以避免MyISAM表进行系统调用
  • 无法使用覆盖索引的情况
    1. 存储引擎不支持覆盖索引
    2. 查询中使用了太多的列
    3. 使用了双%的like索引

5. 使用索引扫描来优化排序

  • 索引的列顺序和order by子句的顺序完全一样
  • 索引中所有列的方向(升序和降序)和order by子句的顺序完全一样
  • order by中的字段全部在关联表中的第一张表中

6. 删除重复和冗余的索引

  • primary key(id),unique key(id),index(id)
  • index(a,b),index(a)
  • primary key(id),index(a,id)

7. 更新索引统计信息及减少索引碎片

  • analyze table table_name
  • optimize table table_name(容易锁表,使用需谨慎!)

8.相关文章

如何正确高效使用mysql的索引–SQL查询优化
如何正确高效使用mysql的索引——Btree索引和Hash索引

你可能感兴趣的:(数据库)