1
我有一個表「t_table1'包含3個字段:MySQL索引的不能使用
`field1` tinyint(1) unsigned default NULL,
`field2` tinyint(1) unsigned default NULL,
`field3` tinyint(1) unsigned NOT NULL default ’0′,
和指數:
KEY `t_table1_index1` (`field1`,`field2`,`field3`),
當我運行此SQL1:
EXPLAIN SELECT * FROM table1 AS c WHERE c.field1 = 1 AND c.field2 = 0 AND c.field3 = 0
然後顯示:
Select type: Simple
tyle: All
possible key: t_table1_index1
key: NULL
key_len: NULL
rows: 1042
extra: Using where
我認爲這是說我的索引在這種情況下是無用的。
但是當我運行這個SQL2:
EXPLAIN SELECT * FROM table1 AS c WHERE c.field1 = 1 AND c.field2 = 1 AND c.field3 = 1
它表明:
Select type: Simple
tyle: ref
possible key: t_table1_index1
key: t_table1_index1
key_len: 5
ref: const, const, const
rows: 1
extra: Using where
它使用我的索引這種情況。 所以請您解釋一下:
爲什麼SQL1不能使用索引?
與SQL1,如何編輯索引或重寫SQL以更快地執行?
謝謝!
表中有多少行?如果索引不會縮小返回的行數,則優化器可以根本不選擇使用索引。 –
我的表有1776條記錄。 SQL1返回10條記錄,SQL2返回0條記錄。 你能解釋得更清楚嗎?爲什麼SQL1不使用索引和SQL2使用索引? –
可能是因爲對於這些值,索引不夠有選擇性(它將返回超過1000行)。優化器查看它並決定讀取索引,然後使用結果來獲取行將比僅執行全表掃描更昂貴。在第二個示例中,查詢將只選擇1行。在這種情況下,使用索引然後獲取單行是值得的。 –