我有這個表:MySQL的:確定正確的索引
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| CODE | varchar(255) | NO | | NULL | |
| REVISION | varchar(255) | NO | | NULL | |
| NAME | varchar(255) | NO | | NULL | |
+---------------------+--------------+------+-----+---------+----------------+
現在,我的應用程序將執行這些查詢(從更可能不太可能):
SELECT * FROM ITEM WHERE ID = ?
SELECT * FROM ITEM WHERE CODE = ? ORDER BY REVISION DESC
SELECT * FROM ITEM WHERE CODE = ? AND REVISION = ?
SELECT * FROM ITEM WHERE CODE LIKE ? OR NAME LIKE ? ORDER BY CODE ASC, REVISION DESC
對於這種情況,索引的最佳組合是什麼?
我在Windows 8.1 x64上使用MySQL 5.6.14(InnoDB)。
UPDATE(仍在測試):
迄今最好使用單獨的索引:IDX_CODE(CODE),IDX_NAME(NAME)。
mysql> describe select id, code, revision from UNIT where code like 'M0170SIGM1%' or name like 'M0170SIGM1%' ORDER BY code ASC, revision DESC;
+----+-------------+-------+-------------+-------------------+-------------------+---------+------+------+------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------------+-------------------+-------------------+---------+------+------+------------------------------------------------------------------+
| 1 | SIMPLE | UNIT | index_merge | IDX_CODE,IDX_NAME | IDX_CODE,IDX_NAME | 767,767 | NULL | 31 | Using sort_union(IDX_CODE,IDX_NAME); Using where; Using filesort |
+----+-------------+-------+-------------+-------------------+-------------------+---------+------+------+------------------------------------------------------------------+
沒有辦法讓MySQL在雙向排序中使用索引。
你是什麼引擎innodb,myisam,檔案或其他東西 – gvgvgvijayan 2014-11-03 12:51:23
InnoDB,對不起,我忘了提及 – 2014-11-03 12:53:00
你的應用程序執行插入?並且LIKE查詢的開頭是否會出現通配符? – Strawberry 2014-11-03 13:24:46