Tre tavoli:
product
: con colonne: ( a, g, ...a_lot_more... )
a: PK, clustered
g: bit-column
main
: con colonne: ( c, f, a, b, ...a_lot_more... )
c: PK, clustered
f: bit-column
(a, b): UQ
lookup
con colonne: ( a, b, c, i )
(a, b): PK, clustered
a: FK to product(a)
c: UQ, FK to main(c)
i: bit-column
Non riesco a trovare buoni indici per il join:
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
Ho provato un indice di copertura product (g, a, ...)
e viene utilizzato ma non con risultati spettacolari.
Alcune combinazioni di indici nella lookup
tabella producono piani di esecuzione con fusione degli indici, con un leggero guadagno di efficienza rispetto al piano precedente.
C'è qualche combinazione ovvia che mi manca?
Potrebbe essere utile una riprogettazione della struttura?
Il DBMS è MySQL 5.5 e tutte le tabelle utilizzano InnoDB.
Tabella dimensioni:
product: 67K , g applied: 64K
main: 420K , f applied: 190K
lookup: 12M , b,i applied: 67K