索引优化

  1. 独立的列

    在进行查询的时候, 索引列不能是表达式的一部分, 也不能是函数的参数, 否则无法使用索引.

    例如下面的查询不能使用actor_id列的索引:

    1
    SELECT actor_id from sakila.actor WHERE actor_id + 1 = 5;
  2. 多列索引

    在需要使用多个列作为条件进行查询时, 使用多列索引比使用多个单列索引性能更好. 例如:

    1
    SELECT file_id, actor_id FROM sakila.film_actor WHERE actor_id = 1 AND file_id = 1;
  3. 索引列的顺序

    让选择性最强的索引放在前面, 索引的选择性是指: 不重复的索引值和记录总数的比值. 选择性越高, 查询效率越高.

  4. 前缀索引

    对于BLOB, TEXT和VARCHAR类型的列, 必须使用前缀索引, 只索引开始的部分字符.

    对于前缀长度的选取需要根据索引选择性来确定.

  5. 覆盖索引

    索引包含所有需要查询的字段的值.

    具有以下优点:

    1. 索引通常远小于数据行的大小, 只读索引能大大减少数据访问量.
    2. 一些存储引擎(例如MyISAM)在内存中只存缓存索引, 而数据库依赖于操作系统来缓存. 因此, 只访问索引可以不使用系统调用.
    3. 对于InnoDB引擎, 若辅助索引能够覆盖查询, 则无需访问主索引.