我有這樣的SQL查詢:在MySQL使用索引並不提高查詢時間
SELECT Frage_ID
FROM Session_Fragen WHERE
(
Userantwort1 = 0
AND Userantwort2 = 0
AND Userantwort3 = 0
AND Userantwort4 = 0
AND Userantwort5 = 0
) AND Session_ID = 17898
ORDER BY Sessionfrage_ID ASC LIMIT 1;
在此查詢運行非常緩慢的開始。 我增加了索引來提高速度。 使用指數我喜歡掃描約。 500.000行... 使用索引後,我減少了行大約。 550(取決於結果) 但查詢仍然需要2秒以上。跑步。
我希望任何人對我有任何改進...
坦克很多!
SQL EXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Session_Fragen index Session_Fragen_big_index_2,Session_Fragen_big_inde... PRIMARY 8 NULL 535 Using where
SHOW指標:
Session_Fragen 0 PRIMARY 1 Sessionfrage_ID A 626229 NULL NULL BTREE
Session_Fragen 1 Frage_ID 1 Frage_ID A 3479 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 1 Userantwort1 A 2 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 2 Userantwort2 A 3 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 3 Userantwort3 A 5 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 4 Userantwort4 A 7 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 5 Userantwort5 A 9 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index 1 Session_ID A 16057 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index 2 Frage_ID A 626229 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index 3
Sessionfrage_ID A 626229 NULL NULL BTREE
Session_Fragen 1 Userantwort1 1 Userantwort1 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort2 1 Userantwort2 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort3 1 Userantwort3 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort4 1 Userantwort4 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort5 1 Userantwort5 A 2 NULL NULL BTREE
Session_Fragen 1 Session_ID 1 Session_ID A 16057 NULL NULL BTREE
表結構:
Session_Fragen CREATE TABLE `Session_Fragen` (
`Sessionfrage_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`User_ID` int(7) NOT NULL,
`SF_Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Session_ID` int(11) NOT NULL,
`Frage_ID` int(11) NOT NULL,
`Userantwort1` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort2` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort3` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort4` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort5` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`Sessionfrage_ID`),
KEY `Frage_ID` (`Frage_ID`),
KEY `Session_Fragen_big_index_2` (`Userantwort1`,`Userantwort2`,`Userantwort3`,`Userantwort4`,`Userantwort5`),
KEY `Session_Fragen_big_index` (`Session_ID`,`Frage_ID`,`Sessionfrage_ID`),
KEY `Userantwort1` (`Userantwort1`),
KEY `Userantwort2` (`Userantwort2`),
KEY `Userantwort3` (`Userantwort3`),
KEY `Userantwort4` (`Userantwort4`),
KEY `Userantwort5` (`Userantwort5`),
KEY `Session_ID` (`Session_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=862095 DEFAULT CHARSET=utf8
嘗試使用SQL JOIN操作,有時會根據設置操作可以執行比常規更快的WHERE操作 – numX
你或許應該在你的UserantworX列使用NULL,而不是投入虛擬0值。您正在使用「0」來表示「沒有價值」的時候,這正是NULL表示。因爲優化處理空值不必查找零更好的它也許也加快了查詢。 –