Wednesday, September 8, 2010

MySQL性能优化12 - FORCE INDEX/IGNORE INDEX

[cci lang="mysql"]FORCE INDEX[/cci] 通常用来对查询强制使用一个或者多个索引。 MySQL 通常会根据统计信息选择正确的索引,但是当查询优化器选择了错误的索引或者根本没有使用索引的时候,这个提示将非常有用。

[cci lang="mysql"]IGNORE INDEX[/cci] 提示会禁止查询优化器使用指定的索引。在具有多个索引的查询时,可以用来指定不需要优化器使用的那个索引,还可以在删除不必要的索引之前在查询中禁止使用该索引。

[cci lang="mysql"]FORCE INDEX/IGNORE INDEX[/cci] 的语法:
[cc lang="mysql"]SELECT *** FROM TABLE [{USE|IGNORE|FORCE} INDEX (key_list)] WHERE ……[/cc]
下面的例子是使用 [cci lang="mysql"]IGNORE INDEX[/cci] 以后,执行计划的变化情况,默认的执行计划是按照主键索引进行扫描,如果我们使用 [cci lang="mysql"]IGNORE INDEX[/cci] 忽略主键索引,则会按照全表扫描执行:
[cc lang="mysql"]
mysql> desc select count(*) from test3 where id = 1 \G

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test3
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
Extra: Using index
1 row in set (0.00 sec)

mysql> desc select count(*) from test3 ignore index (primary) where id = 1 \G

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test3
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 862560
Extra: Using where

1 row in set (0.00 sec)[/cc]

No comments:

Post a Comment