MySQL使用索引的情况

索引是数据库优化很常见和重要的手段之一。 复习下在MySQL数据库中索引的使用情况。

一 使用的情况:

1)在复合索引中(即多列组成的索引),最左边的列才被使用索引。 比如order(order_id, user_id, user_name)中,为 (user_id, user_name)列创建索引,当按user_id查询SELECT * FROM order WHERE user_id = 2011,此时WHERE条件不是用的user_id和user_name复合索引,索引仍然会被使用,这也是索引的前缀特性。 但如果按user_name进行查询,索引则不可用。

2)在LIKE查询中,后边如果是常量且%不在首字符,索引才被使用。 如: 索引字段 LIKE ‘2011%’(索引被使用),但 LIKE ‘%2011’(索引不被使用)。

3)‘索引字段 is NULL’ 的情况将使用索引。

4) MEMORY/HEAP表的查询使用‘=’的条件下索引才起作用。

二 不使用的情况:

1)复合索引中,使用不是第一列的其它列进行查询时,不使用索引。

2) 使用索引比全表扫描更慢时不用索引。 比如 ‘id > 1 OR id < 10’(id是索引字段)。

3) MEMORY/HEAP表WHERE条件不使用‘=’进行索引列。

4) 在OR条件中,OR前的列是索引列,OR后的列不是索引列,那么索引列无效。

5)LIKE条件中%在第一位,不使用索引。

6)索引列如果是字符类型,对字符常量查询如果无引号,索引无效。比如 SELECT * FROM order WHERE user_name = 2011(user_name是索引列),此时查询有效,但索引无效(进行全表扫描)。 user_name=’2011’则索引被使用。

另外,我们通过SHOW STATUS命令了解各个SQL的执行频率(show status like ‘Handler_read%’查看索引的使用情况),EXPLAIN分析各个SQL执行计划,这涉及优化方面,再探讨。

发表回复

您的电子邮箱地址不会被公开。