介绍
MySql索引提示(hint)用于告诉查询优化器在查询中如何选择索引,它跟在表名后边,形式是:
tbl_name [[AS] alias] [index_hint_list]
index_hint_list: index_hint [index_hint] ...
index_hint: USE {INDEX|KEY}[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| IGNORE {INDEX|KEY}[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
| FORCE {INDEX|KEY}[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
index_list: index_name [, index_name] ...
索引提示的种类和示例
MySql共有三种索引提示,分别是:USE INDEX、IGNORE INDEX和FORCE INDEX,他们之间的区别是:
- use index:use index告诉MySql用列表中的其中一个索引去做本次查询,例子:
SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
- ignore index:ignore index告诉mysql不要使用某些索引去做本次查询,例子:
SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
- force index:force index和use index功能类似,都是告诉mySQL去使用某些索引。force index和use index的区别是,如果使用force index,那么全表扫描就会被假定为需要很高代价,除非不能使用索引,否则不会考虑全表扫描;而使用use index的话,如果MySql觉得全表扫描代价更低的话,仍然会使用全表扫描。例子:
SELECT * FROM table1 FORCE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
- 上边三种提示也可以合理地混合使用
索引提示的用途
可以在索引提示的后边使用FOR语句指定提示的范围,索引提示共有三种适用范围,分别是FOR JOIN、FOR ORDER BY、FOR GROUP BY:
- FOR JOIN:索引提示用于查找行或者用于表的连接。
- FOR ORDER BY:索引提示用于排序。
- FOR GROUP BY:索引提示用于分组。
此外,需要注意的是,如果在mySQL 5.0版本及以下,如果不指定FOR语句,那么mySQL只会用它来查找行;而在新版本的mySQL,如果不指定FOR语句,那么mySQL会把索引用于所有用途。
几个例子:
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2)
ORDER BY a;
SELECT * FROM t1 USE INDEX FOR JOIN (i1) FORCE INDEX FOR JOIN (i2);