Sja, met zulke aantallen zal je sowieso naar slimme(re) trucjes moeten kijken als een index niet voldoet. Een 200-kolom brede tabel zal je daar niet bij helpen, want MySQL kan maar 1 index per tabel in een query gebruiken, dus als je dan op 3 booleans wilt zoeken zal MySQL er een moeten gebruiken (tenzij je een gecombineerde index daarvoor had) en aangezien het booleans zijn zou dat een nogal inefficiente index-zoektocht zijn.
Een potentiele verbetering die ik zo kan bedenken ik om de query anders op te zetten, voor strict:
SQL:
1
2
3
4
| SELECT t1.userid FROM tabel t1
JOIN tabel t2 ON t1.userid = t2.userid AND t2.opt = 20
JOIN tabel t3 ON t1.userid = t3.userid AND t3.opt = 30
WHERE t1.opt = 10 |
Of zoiets:
SQL:
1
2
3
4
| SELECT t1.userid FROM tabel t1
WHERE t1.opt = 10
AND t1.userid IN (SELECT t2.userid FROM tabel t2 WHERE t2.opt = 20
AND t2.userid IN (...) |
Of zelfs spelen met union (intersect kent MySQL uiteraard weer niet

)
Bovenstaande queries kunnen sneller zijn, maar hoeven het niet. Zeker in MySQL's zeer beperkte query-planner is het erg lastig goede performance uit dergelijke grote aantallen te krijgen.
Test overigens ook hoelang het duurt om 1 conditie op te halen (dus select userid from tabel where opt = 10), als dat al meerdere seconden kost, dan gaat bovenstaande tabelstructuur niet best werken in termen van performance. Ow en test je query ook nog met een LIMIT-clause erachter, de kans is aanwezig dat je query-tijd dan een stuk lager is, en sowieso is dat een realistischer resultaatset.
Mocht je nog de mogelijkheid hebben over te stappen op een ander DBMS, probeer dan nog met PostgreSQL (8.1 Beta) te kijken hoe dat presteert (die overigens een onbeperkt aantal indexen op een tabel aankan en die ook weet te combineren indien nodig

). In mijn ervaring presteert die met dit soort queries aanzienlijk beter, zij het dat je wel wat meer tuning nodig hebt in het begin en wat actiever onderhoud tijdens het gebruik.
[
Voor 11% gewijzigd door
ACM op 18-09-2005 22:28
]