三个表:
product
:带有列: ( a, g, ...a_lot_more... )
a: PK, clustered
g: bit-column
main
:带有列: ( c, f, a, b, ...a_lot_more... )
c: PK, clustered
f: bit-column
(a, b): UQ
lookup
带列: ( a, b, c, i )
(a, b): PK, clustered
a: FK to product(a)
c: UQ, FK to main(c)
i: bit-column
我找不到用于联接的良好索引:
FROM
product
JOIN
lookup
ON lookup.a = product.a
JOIN
main
ON main.c = lookup.c
WHERE
product.g = 1
AND
main.f = 1
AND
lookup.i = 1
AND lookup.b = 17
我尝试了覆盖索引,product (g, a, ...)
并使用了它,但效果不佳。
lookup
表中索引的某些组合会生成带有索引合并的执行计划,与以前的计划相比,效率会有所提高。
我缺少一些明显的组合吗?
重新设计结构会有所帮助吗?
DBMS是MySQL 5.5,所有表都使用InnoDB。
桌子尺寸:
product: 67K , g applied: 64K
main: 420K , f applied: 190K
lookup: 12M , b,i applied: 67K
尝试将过滤谓词移动到联接中,看看优化器是否对此做出了明智的选择。我以前见过SQL Server的优化器失败。
—
ConcernedOfTunbridgeWells
看起来像笛卡尔积,因为在积表中看不到任何JOINING。还是我错过了什么?
—
RolandoMySQLDBA'8年
@RolandoMySQLDBA:你是对的。我将更正查询。
—
ypercubeᵀᴹ