Performance

最佳性能索引 - MySQL

  • March 30, 2022

我有一個與性能數據庫 MySQL 相關的問題。我有這樣的查詢,裡面有大數據:

SELECT 
      * 
FROM 
      tableA a 
      INNER JOIN tableB b ON a.id = b.id AND a.code = b.code
      INNER JOIN tableC c ON a.uniq = c.uniq
WHERE
      a.date = '2020-01-01'
      AND a.type = 'X'
      AND b.merk =  'New';

我的問題是,使用單索引或多列索引哪個更好?

前任 :

表 A 中的索引(範例 1):

  • idx1(merk、程式碼、日期、類型)
  • idx2(日期)
  • idx3(品牌)
  • idx4(程式碼)
  • idx5(類型)

表 A 中的索引(範例 2):

  • idx1(merk、程式碼、日期、類型)
  • idx2(品牌、程式碼)
  • idx3(日期,類型)

什麼是更好的?範例 1 還是範例 2?請解釋一下。

注意:也許 tableA 會在未來的另一個查詢中獲得 varian WHERE

謝謝

該引擎將只能使用每個表的一個索引,因此雖然其他索引可能會在將來幫助您處理其他查詢,但它們的好處將僅限於幫助您處理此特定查詢。

鑑於我們對您的查詢的了解以及對錶和插入模式的有限了解,我建議以下內容。

Table A - (Date, Type)
Table B - (merk, ID, Code)
Table C - (Uniq)

當然,如果您能夠限制結果集列(擺脫 SELECT *),那麼索引中的其他列可能會有所幫助。

上面的這些索引將允許引擎快速查找并快速找到它想要的行。

我確實有一個關於表 B 上的“merk”的問題。如果這類似於一種狀態的變化,那麼我不會在它上面建立索引,只留下一個關於 ID 和程式碼的索引。如果欄位的值經常變化,那麼它通常是一個糟糕的索引候選,因為它會導致很多碎片。

最好的結果可以用下面的索引來估計:

Table A - (id, uniq, date, code, type)
Table B - (id, code, merk)
Table C - (uniq)

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