ype*_*eᵀᴹ 11 mysql optimization mysql-5.5
三张表:
product
:与列: ( a, g, ...a_lot_more... )
a: PK, clustered
g: bit-column
Run Code Online (Sandbox Code Playgroud)
main
:与列: ( c, f, a, b, ...a_lot_more... )
c: PK, clustered
f: bit-column
(a, b): UQ
Run Code Online (Sandbox Code Playgroud)
lookup
带列: ( a, b, c, i )
(a, b): PK, clustered
a: FK to product(a)
c: UQ, FK to main(c)
i: bit-column
Run Code Online (Sandbox Code Playgroud)
我找不到合适的连接索引:
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
Run Code Online (Sandbox Code Playgroud)
我尝试了一个覆盖索引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
Run Code Online (Sandbox Code Playgroud)
这让我很痛苦...
我之前不得不将临时表与 InnoDB 一起使用。使用过滤器加载它们,创建索引,连接这些临时表。
我认为问题是 InnoDB 是否只有 Nested Join 算法:成熟的 RDBMS 查询优化器有更多可用的。这是基于尝试在 InnoDB 上运行数据仓库类型加载。
临时表降低了 MySQL 查询优化器的整体复杂性......
归档时间: |
|
查看次数: |
229 次 |
最近记录: |