所以每當我解釋一下我的查詢,我經常得到它申明某些領域儘可能密鑰,但隨後密鑰表將是空的情況下...爲什麼MySQL的不使用按鍵時,有可能的密鑰
爲什麼MySQL會這樣做,並決定不使用密鑰,事實上它可以使用可能的密鑰?
所以每當我解釋一下我的查詢,我經常得到它申明某些領域儘可能密鑰,但隨後密鑰表將是空的情況下...爲什麼MySQL的不使用按鍵時,有可能的密鑰
爲什麼MySQL會這樣做,並決定不使用密鑰,事實上它可以使用可能的密鑰?
它不能一直使用的一個關鍵,例如:
SELECT * FROM A, B where A.id = B.id;
雖然id
是兩個查找一個可能的密鑰,就不能使用爲兩種。其中一個表格必須進行全面掃描。
優化程序可以合理地計算出,使用索引會導致比全表掃描更差的性能。
我給你舉個例子:
說,你有被索引,但90%的您的記錄是女性性別字段。優化器可以使用索引,但是由於數據的傳播發生偏斜,因此只進行全表掃描可能會更高效。
如果90%是女性,如果您選擇了男性,MySQL可能會使用該索引。雖然它的基數很低,但選擇性仍然很高。它仍然取決於將返回的行數。如果您試圖選擇女性,MySQL會想要進行全表掃描。 – 2012-08-02 19:30:42
準確地說 - 優化器會使用數據的查詢和傳播來確定最佳執行計劃。 – 2012-08-02 19:36:53
你可以顯示一個示例查詢嗎? – 2012-08-02 19:21:37