Mám v práci tabulku se stejným druhem věcí, spoustou sloupců a 1000 různými způsoby výběru. Je to noční můra. Zjistil jsem však, že existují určité kombinace filtrů, které se často používají. Právě pro ty bych vytvořil indexy a nechal ostatní, které se zřídka používají k pomalému běhu. V MSSQL mohu spustit dotaz, který mi ukáže nejdražší dotazy, které byly spuštěny proti databázi, mySQL by měla mít podobnou věc. Jakmile je mám, vytvořím index, který pokryje sloupce, abych je urychlil. Nakonec to budete mít z 90 procent pokryto. Já osobně bych takový stůl už nikdy nenavrhl, pokud bych na mě nemířil AK47. (moje indexy jsou 3krát větší než data v tabulce, což je velmi nechutné, pokud potřebujete přidat spoustu nebo záznamy). Nejsem si jistý, jak bych přepracoval tabulku, moje první myšlenka by byla rozdělit tabulku na dvě , ale to by se přidalo k bolestem hlavy jinde.
Tabulka uživatelů (UserID, Name)
1, Lisa
2, Jane
3, John
Tabulka uživatelských atributů (UserID, AttributeName,AttributeValue)
1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3 EYES, Blue
3, GENDER, Male
To by zrychlilo identifikaci atributů, ale vaše dotazy by se nepsaly tak přímočaře.
SELECT UserID, COUNT(*) as MatchingAttributes
FROM UserAttributes
WHERE (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
(UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female')
To by mělo vrátit následující
UserID, MatchingAttributes
1, 1
2, 2
3, 1
Vše, co musíte udělat, je přidat do dotazu HAVING COUNT(*) =2, abyste vybrali pouze odpovídající ID. Je to trochu složitější na výběr, ale také poskytuje úhlednou funkci, řekněme, že filtrujete podle 10 atributů a vrátíte všechny, které mají 10 odpovídajících. Skvělé, ale řekněme, že žádný neodpovídá 100 %. Dalo by se říct hej, nenašel jsem žádnou, která by odpovídala, ale tyto měly 9 z 10 nebo 90% shodu. (jen se ujistěte, že když hledám modrookou blonďatou ženu, neobdržím zprávu, že žádná nebyla nalezena, ale zde jsou další nejbližší odpovídající, obsahující modrooké blonďaté chlapíky se shodným skóre 60 %. To by být velmi chladný)
Pokud se rozhodnete tabulku rozdělit, je třeba zvážit více věcí, například jak ukládáte atributy jako čísla, data a text do jednoho sloupce? Nebo jsou to samostatné tabulky či sloupce. Není snadná odpověď, ať už jde o široký stůl nebo rozdělené stoly.