【 TiDB 使用环境】生产环境
【 TiDB 版本】8.5.4
【遇到的问题:做SQL优化时遇到很多索引选择错误的,在mysql能正确使用索引,tidb中就经常不能正确使用,比如下面这个例子:
SQL:
SELECT
L.*,
G.GOODS_NAME,
G.OUT_GOODS_ID,
G.UPC_CODE,
G.COVER_PIC
FROM
D_GOODS G
-- force index(INDEX_OUT_GOODS_ID)
left JOIN WM_GOODS_LOG L
-- force index(INDEX_GOODS_ID)
ON G.GOODS_ID = L.GOODS_ID
WHERE
L.MERCH_ID = 635
AND L.WM_PLAT = 'MTSG'
AND L.STORE_ID = 55599
AND G.OUT_GOODS_ID = '423550'
limit 20;
执行计划的estrows非常高,索引应该用INDEX_OUT_GOODS_ID
如果去掉AND L.STORE_ID = 55599条件就是能正常:
健康度:
Db_name Table_name Partition_name Healthy
ystpos wm_goods_log global 65
ystpos wm_goods_log p20260316 80
ystpos wm_goods_log p20260317 73
ystpos wm_goods_log p20260318 54
ystpos wm_goods_log p20260319 68
ystpos wm_goods_log p20260320 62
ystpos wm_goods_log p20260321 66
ystpos wm_goods_log p20260322 78
ystpos wm_goods_log p20260323 84
ystpos wm_goods_log p20260324 0
ystpos wm_goods_log p20260325 0
ystpos wm_goods_log p20260326 0
ystpos wm_goods_log p20260327 0
ystpos wm_goods_log p20260328 0
ystpos wm_goods_log p20260329 0
ystpos wm_goods_log p20260330 0
ystpos wm_goods_log p20260331 0
ystpos wm_goods_log p20260401 0
ystpos wm_goods_log p20260402 0
ystpos wm_goods_log p20260403 0
ystpos wm_goods_log p20260404 0
ystpos wm_goods_log p20260405 0
ystpos wm_goods_log p20260406 0
ystpos wm_goods_log p20260407 0
Db_name Table_name Partition_name Healthy
ystpos d_goods 100
和健康度关系不大,其他类型的SQL我整理表后依旧是这样
show index from WM_GOODS_LOG;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality
wm_goods_log 0 PRIMARY 1 GOODS_LOG_ID A 232652800
wm_goods_log 0 PRIMARY 2 LAST_MODIFIED A 631552
wm_goods_log 1 INDEX_LAST_MODIFIED 1 LAST_MODIFIED A 631552
wm_goods_log 1 INDEX_MERCH_LAST_MODIFIED 1 MERCH_ID A 109
wm_goods_log 1 INDEX_MERCH_LAST_MODIFIED 2 LAST_MODIFIED A 631552
wm_goods_log 1 INDEX_GOODS_ID 1 GOODS_ID A 340608
实际count的数据行数:241853739

