MySQL index hints 使用
index hints可以人為的告訴mysql最佳化器要如何完成select,比如強制走某(些)索引或忽略某(些)索引。
其中,被指定的索引必須要有索引名。
官方提供的基礎語法:
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為索引名。
測試用表:
隨機插入一些資料:
正常select(注,explain結果部分省略,下同)
加一個複合索引
①指定使用idx_1_2索引
②忽略目前表中的三個索引
再次正常select:
此時col2走了索引,而order by col3沒有走索引。
③忽略idx_2索引,此時全表掃描:
④強制對order by語句使用idx_3索引:
同理,除了WHERE和ORDER BY,可以同樣對GROUP BY、JOIN操作進行USE、IGNORE、FORCE三種HINTS。
寫法為:
(USE, FORCE, IGNORE) and by scope (FOR JOIN, FOR ORDER BY, FOR GROUP BY).
參考文件:
MySQL 5.6 Reference Manual 13.2.9.3 Index Hint Syntax
作者微信公眾號(持續更新)
其中,被指定的索引必須要有索引名。
官方提供的基礎語法:
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為索引名。
測試用表:
-
mysql> CREATE TABLE hints_test(col1 int,
-
-> col2 int,
-
-> col3 int,
-
-> KEY idx_1(col1),
-
-> KEY idx_2(col2),
-
-> KEY idx_3(col3));
-
Query OK, 0 rows affected (0.09 sec)
隨機插入一些資料:
- mysql> SELECT * FROM hints_test;
- +------+------+------+
- | col1 | col2 | col3 |
-
+------+------+------+
-
| 1 | 2 | 3 |
-
| 2 | 2 | 3 |
-
| 2 | 3 | 3 |
-
| 3 | 3 | 5 |
-
| 3 | 1 | 2 |
-
| 2 | 1 | 1 |
-
| 2 | 3 | 3 |
-
| 4 | 4 | 4 |
-
| 6 | 5 | 3 |
-
+------+------+------+
-
9 rows in set (0.00 sec)
正常select(注,explain結果部分省略,下同)
- mysql> EXPLAIN SELECT col1, col2, col3
- -> FROM hints_test
- -> WHERE col1=1 AND col2=2\G
- *************************** 1. row ***************************
- table: hints_test
-
type: ref
-
possible_keys: idx_1,idx_2
-
key: idx_1
-
key_len: 5
-
ref: const
加一個複合索引
-
mysql> ALTER TABLE hints_test ADD INDEX idx_1_2(col1,col2);
-
Query OK, 0 rows affected (0.57 sec)
- Records: 0 Duplicates: 0 Warnings: 0
①指定使用idx_1_2索引
- mysql> EXPLAIN SELECT col1, col2, col3
- -> FROM hints_test
- -> USE INDEX (idx_1_2)
- -> WHERE col1=1 AND col2=2\G
- *************************** 1. row ***************************
- table: hints_test
- type: ref
- possible_keys: idx_1_2
- key: idx_1_2
- key_len: 10
-
ref: const,const
②忽略目前表中的三個索引
- mysql> EXPLAIN SELECT col1, col2, col3
- -> FROM hints_test
- -> IGNORE INDEX (idx_1_2,idx_1,idx_2)
- -> WHERE col1=1 AND col2=2\G
- *************************** 1. row ***************************
- table: hints_test
- type: ALL
- possible_keys: NULL
- key: NULL
- key_len: NULL
-
ref: NULL
再次正常select:
此時col2走了索引,而order by col3沒有走索引。
- mysql> EXPLAIN SELECT col1, col2, col3
- -> FROM hints_test
- -> WHERE col2=2 ORDER BY col3\G
- *************************** 1. row ***************************
- table: hints_test
- type: ref
- possible_keys: idx_2
- key: idx_2
- key_len: 5
- ref: const
③忽略idx_2索引,此時全表掃描:
- mysql> EXPLAIN SELECT col1, col2, col3
- -> FROM hints_test
- -> IGNORE INDEX (idx_2)
- -> WHERE col2=2
- -> ORDER BY col3\G
- *************************** 1. row ***************************
- table: hints_test
- type: ALL
- possible_keys: NULL
- key: NULL
- key_len: NULL
- ref: NULL
④強制對order by語句使用idx_3索引:
- mysql> EXPLAIN SELECT col1, col2, col3 FROM hints_test
- -> FORCE INDEX FOR ORDER BY (idx_3)
- -> IGNORE INDEX (idx_2)
- -> WHERE col2=2
- -> ORDER BY col3\G
- *************************** 1. row ***************************
- table: hints_test
- type: index
- possible_keys: NULL
- key: idx_3
- key_len: 5
- ref: NULL
同理,除了WHERE和ORDER BY,可以同樣對GROUP BY、JOIN操作進行USE、IGNORE、FORCE三種HINTS。
寫法為:
(USE, FORCE, IGNORE) and by scope (FOR JOIN, FOR ORDER BY, FOR GROUP BY).
參考文件:
MySQL 5.6 Reference Manual 13.2.9.3 Index Hint Syntax
作者微信公眾號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2057752/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle hints index格式OracleIndex
- Mysql——index(索引)使用MySqlIndex索引
- index 和 index_desc hints的一點有意思的區別Index
- oracle hints的使用Oracle
- Oracle使用提示(Hints)Oracle
- mysql oder by 使用index一例MySqlIndex
- <MYSQL Index>MySqlIndex
- mysql 索引( mysql index )MySql索引Index
- MySQL Index Condition Pushdown(ICP)的使用限制MySqlIndex
- WITH AS and materialize hints
- Oracle HintsOracle
- MYSQL中的type:index 和 Extra:Using indexMySqlIndex
- 【Mysql】index extensions介紹MySqlIndex
- mysql的Covering IndexMySqlIndex
- 【譯】Resource Hints
- Index of /Downloads/MySQL-5.5/IndexMySql
- 【Mysql】MySQL · 特性分析 · Index Condition Pushdown (ICP)MySqlIndex
- Using hints for PostgresqlSQL
- Oracle Hints詳解Oracle
- Oracle Hints的用法Oracle
- MySQL中為什麼要使用索引合併(Index Merge)?MySql索引Index
- 【MySQL】Merge Index導致死鎖MySqlIndex
- mysql 函式substring_index()MySql函式Index
- mysql loose index scan的實現MySqlIndex
- B-index、bitmap-index、text-index使用場景詳解Index
- HTTP Client Hints 介紹HTTPclient
- Common LISP Hints 中文Lisp
- oracle hints用法總結Oracle
- Hints : DRIVING_SITE
- hints提示總結 zt
- 使用Index提示 強制使用索引Index索引
- 查詢使用表空間的TABLE,INDEX,INDEX SUBPARTITIONIndex
- 【mysql】SUBSTRING_INDEX 用法舉例MySqlIndex
- 【INDEX】使用“alter index ××× monitoring usage;”語句監控索引使用與否Index索引
- 【sql調優之執行計劃】使用hint(四)Hints for JoinSQL
- Oracle Hints語句的用法Oracle
- oracle hints的那點事Oracle
- How to use hints in Oracle sql for performanceOracleSQLORM