MySql索引提示

介绍

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);

你可能感兴趣的:(MySql)