誰能告訴我什麼是這兩者之間的區別:MySQL:`... ADD INDEX(a);之間的區別... ADD INDEX(b);`和`... ADD INDEX(a,b);`?
ALTER TABLE x1 ADD INDEX(a);
ALTER TABLE x1 ADD INDEX(b);
和
ALTER TABLE x1 ADD INDEX(a,b);
我知道這個下降到非常基本的,但有時我覺得前者似乎是一個快一點比後者。這只是我的感覺還是有其實際的原因呢?
誰能告訴我什麼是這兩者之間的區別:MySQL:`... ADD INDEX(a);之間的區別... ADD INDEX(b);`和`... ADD INDEX(a,b);`?
ALTER TABLE x1 ADD INDEX(a);
ALTER TABLE x1 ADD INDEX(b);
和
ALTER TABLE x1 ADD INDEX(a,b);
我知道這個下降到非常基本的,但有時我覺得前者似乎是一個快一點比後者。這只是我的感覺還是有其實際的原因呢?
隨着你的第二個選項,下面的查詢將不會使用索引:
SELECT * FROM x1 WHERE b = 'something';
中列在索引定義中列出的順序很重要。可以僅使用第一個索引列來檢索一組行標識符。但是,僅在第二個或更大的索引列中檢索一組行標識符是不可能的或有效的(在大多數數據庫上)。
組合的INDEX是鍵「a」和「b」的組合。如果「a」或「a」和「b」是搜索表達式的一部分,它將顯着改善訪問。
如果您在SQL語句中僅提供「b」,則此索引無用。
因此,提供兩個不同的索引可能會很有用 - 但它們應該使用不同的名稱。
根據訪問模式,如果這符合您的需求,我會推薦「a」和「b」索引和「b」索引中的附加索引。
請記住,任何附加索引都會降低數據庫在所有修改數據的操作上的速度。有時候,最好保留一些指標。在表格的任何欄目中不使用索引通常是一個很好的建議。
還有一個提示:要判斷是否應該使用INDEX(a,b)或INDEX(b,a),請查看數據的分佈。將具有不同值的較高分散值的值放入索引的第一列以增加該索引的選擇性。該值通常基於第一個索引元素的質量。
例如,NAME和SEX列上的索引應創建爲INDEX(NAME,SEX),因爲還有更多不同性別的名稱(es?)。
所以我只能在我搜索類似'SELECT * FROM x1 WHERE a ='something'和b ='somethingelse''時使用它? – Legend
像SELECT * FROM x1 WHERE a ='something''這樣的查詢也將使用複合索引(第二個選項)。列的順序在索引定義中很重要。 –
我明白了...太棒了!感謝您的解釋... – Legend