簡體   English   中英

MySQL 可以使用其中一個字段為 WHERE 字段 > 0 的復合索引嗎?

[英]Can MySQL use a composite index where one of the fields is WHERE field > 0?

我們在很多地方都使用復合索引,而且效果很好。 我們的平台有一個相對復雜的“報告生成器”,它根據用戶 select 的內容動態編寫查詢。 我們根據常見查詢選擇索引,並且我們的復合索引通常與用戶想要的內容很好地對齊。

例如(簡化一噸),用戶的報告將變成查詢:

SELECT
  colA,
  colB,
  SUM(col1),
  SUM(col2)
FROM
  someTable
WHERE
  colA = "foo"
  AND colB = "bar"
  AND colC = "baz"
GROUP BY 1, 2;

表格看起來像:

CREATE TABLE someTable (
    id PRIMARY KEY,
    col1 data_type,
    col2 data_type,
    colA data_type,
    colB data_type,
    colC data_type,
    INDEX someIndex (colA,colB,colC)
);

我知道 MySQL 將無法在如下查詢中使用該索引:

SELECT
  colA,
  colB,
  SUM(col1),
  SUM(col2)
FROM
  someTable
WHERE
  colB = "foo"
GROUP BY 1, 2;

我的問題是- MySQL 是否將復合索引與如下查詢一起使用:

SELECT
  colA,
  colB,
  SUM(col1),
  SUM(col2)
FROM
  someTable
WHERE
  colA != ""
  AND colB = "foo"
GROUP BY 1, 2;

當然,我知道我們可以在colB上添加一個索引,但在這種情況下這不是一個好的選擇。 我在這里進行了簡化以使問題更清楚。 實際上,我們在這個表中有 100 列,並且不能在每列上添加索引和可能的列變化,所以我試圖弄清楚我們是否可以利用我們已經擁有的東西來加快速度那些邊緣情況查詢。

希望我說得好。 提前致謝:)

我的問題是 - MySQL 是否會使用復合索引和如下查詢:...

不,不會。 不等於 ( != ) 匹配不可索引,因此索引必須以 colB 開頭才能使索引可用。 如果您將索引從 (colA, colB, colC) 更改為 (colB, colA, colC),則該索引將可用於您提到的第一個查詢和您正在詢問的查詢。

SELECT SUM(..), SUM(..)
    ...
    GROUP BY 1,2

沒有意義。 通常,一個GROUPs BY標量列,而不是聚合。 去掉GROUP BY ,你可能會得到相同的答案,而且得到的更快一點。

構建索引時,從使用= (或IS NULL )測試的列開始。

然后轉到任何IN(constant list) ,因為它有時像= ,有時像一個范圍。

然后是一個“范圍” BETWEEN或任何不等式

因此對於

WHERE
  colA != ""
  AND colB = "foo"

colB應該排在第一位。 因此 `INDEX(colB, colA)以該順序適用於該查詢(以及之前的查詢)。

如前所述,按該順序排列的INDEX(colB, colA, colC)將適用於所有三個查詢,但可能不適用於其他查詢。

INDEX中列的順序很重要; WHERE中的訂單沒有。 綜合指數的各個組成部分的基數無關緊要。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM