Mysql

對 MySql 中索引的列的多個查詢

  • January 7, 2020

我正在嘗試使用伺服器端頁面製作一個表格,因此它還可以為我的表格中的每一列應用過濾器。這是它的結構:

+----------------+
|    products    |
|----------------|
| id       int   |
| title    string|
| date     date  |
| category string| 
+----------------+

所以我想到為要過濾的列創建一個複合索引:

CREATE INDEX index_name 
ON products(c2,c3,c4);

正如文件所說,問題在於如果列沒有在索引左側形成前綴,則查詢優化器無法使用索引來執行搜尋。那麼如果特定列的索引順序不正確,我就無法為它設置WHERE條件,這對我來說是個問題,因為我的查詢可以根據使用者的需要以任何順序包含一個或多個條件,例如:

SELECT * FROM products WHERE title = ""
SELECT * FROM products WHERE date = ""
SELECT * FROM products WHERE category = ""
SELECT * FROM products WHERE title = "" AND date = ""
SELECT * FROM products WHERE title = "" AND date = "" AND category = ""

所以多列的索引不是我的情況的最佳選擇,所以我想為我的每個列添加一個單獨的 id,這是一個好習慣還是有另一種方法來解決這個問題?

該索引將處理您的 3 個查詢:

INDEX(title, date,  -- in either order
     category)     -- last

然後,您將需要另外兩個索引來處理其他兩個查詢。假設您使用上面的順序,那麼這些可能是另外兩個。

INDEX(category)
INDEX(date)

如果您有十幾個列,並且使用者幾乎可以過濾它們的任何組合,那麼您所能做的就是猜測什麼是最好的。一些一般規則:

  • 不要製作十幾個索引
  • 在每個索引中使用大約 3 列
  • 確保使用最常用的過濾器開始其中一些

但是也, …

  • 如果過濾是在一個範圍內(例如,價格範圍),它應該是索引中的最後一個。
  • 在為複合索引中的特定列順序爭論時,不要聽那些談論基數的人。
  • 如果title太大而無法編入索引,則將其排除在所有索引之外。不要使用“前綴索引”,如title(20).

更多討論:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql

引用自:https://dba.stackexchange.com/questions/256780