我很難理解我應該創建哪些索引。
我做了這個包含各種情況(選擇、加入、分組、排序等)的示例查詢。我應該在這個樣本上創建什么索引/索引?
表 A:2 GB 大小
表 B:大小為 100kb
SELECT A.AAA, A.BBB, A.CCC, B.mycol
From tableA as A
INNER JOIN tableB as B
ON A.ID = B.ID
WHERE AAA='3'
AND BBB>'2021-10-10'
AND CCC<'2021-11-01'
GROUP BY B.mycol, A.AAA, A.BBB, A.CCC
ORDER BY A.AAA desc
我的理解是我必須創建一個單獨的 inxed,其中包含 A.ID、A.AAA、A.BBB 和 A.CCC。表 B 不需要索引,因為它很小并且不會做任何更改。
這樣對嗎?還是我需要創建多個索引?
uj5u.com熱心網友回復:
您想優化查詢的執行時間:
SELECT A.AAA, A.BBB, A.CCC, B.mycol
From tableA as A
INNER JOIN tableB as B
ON A.ID = B.ID
WHERE AAA='3'
AND BBB>'2021-10-10'
AND CCC<'2021-11-01'
GROUP BY B.mycol, A.AAA, A.BBB, A.CCC
ORDER BY A.AAA desc
由于此查詢tableA僅使用列過濾資料,因此tableA將是驅動表。
在驅動表中,我們需要包括過濾列,首先考慮等式過濾器,然后是非等式過濾器,從最高到最低的選擇性。在這種情況下:
- AAA
- BBB
- CCC
該GROUP BY子句沒有做任何事情,所以我們將忽略它。
上面的索引將按ORDER BY子句要求的順序提供行,引擎將向后走。因此,無需為此目的調整索引。
最后,引擎將執行嵌套回圈以從 中檢索行tableB。為了有效地執行此操作,查詢將需要并通過以下方式進行索引:
- ID
- mycol(可選,如果我們想要一個覆寫索引以獲得更高的性能)
簡而言之,您將需要以下兩個索引:
create index ix1 on tableA (AAA, BBB, CCC);
create index ix2 on tableB (ID);
如果表格的直方圖另有說明,請考慮引擎墊無論如何都會忽略它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/346165.html
上一篇:優化給定的sql查詢以提高速度
下一篇:如何在此查詢中使用
