优化问题:复合聚簇键、标志条件和索引合并

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)

gbn*_*gbn 3

这让我很痛苦...

我之前不得不将临时表与 InnoDB 一起使用。使用过滤器加载它们,创建索引,连接这些临时表。

我认为问题是 InnoDB 是否只有 Nested Join 算法:成熟的 RDBMS 查询优化器有更多可用的。这是基于尝试在 InnoDB 上运行数据仓库类型加载。

临时表降低了 MySQL 查询优化器的整体复杂性......