Mam w pracy tabelę z takimi samymi rzeczami, dużą ilością kolumn i 1000 różnych sposobów wyboru. To koszmar. Odkryłem jednak, że istnieją pewne kombinacje filtrów, które są często używane. To właśnie dla nich utworzyłbym indeksy i zostawiłem inne, które rzadko są używane do powolnego działania. W MSSQL mogę uruchomić zapytanie, aby pokazać mi najdroższe zapytania, które zostały uruchomione w bazie danych, mySQL powinien mieć podobną rzecz. Kiedy już je mam, tworzę indeks, który obejmuje kolumny, aby je przyspieszyć. W końcu pokryjesz to w 90 procentach. Osobiście nigdy więcej nie zaprojektowałbym takiego stołu, gdyby nie wycelowany we mnie AK47. (moje indeksy są 3 razy większe niż dane w tabeli, co jest bardzo niefajne, jeśli trzeba dodać kilka lub rekordów). Nie jestem jednak pewien, jak przeprojektować tabelę, Moją pierwszą myślą byłoby podzielenie tabeli na dwie , ale to spowodowałoby ból głowy gdzie indziej.
Tabela użytkowników (identyfikator użytkownika, nazwa)
1, Lisa
2, Jane
3, John
Tabela atrybutów użytkownika (identyfikator użytkownika, nazwa atrybutu, wartość atrybutu)
1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3 EYES, Blue
3, GENDER, Male
To przyspieszyłoby identyfikację atrybutów, ale sprawiłoby, że Twoje zapytania nie byłyby tak proste do napisania.
SELECT UserID, COUNT(*) as MatchingAttributes
FROM UserAttributes
WHERE (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
(UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female')
Powinno to zwrócić następujące
UserID, MatchingAttributes
1, 1
2, 2
3, 1
Wszystko, co musisz zrobić, to dodać do zapytania HAVING COUNT(*) =2, aby wybrać tylko pasujące identyfikatory. Wybór jest nieco bardziej skomplikowany, ale daje też fajną funkcję, powiedzmy, że filtrujesz według 10 atrybutów i zwracasz wszystkie te, które mają 10 pasujących elementów. Fajnie, ale powiedzmy, że żaden nie pasuje w 100%. Możesz powiedzieć hej, nie znalazłem żadnego pasującego, ale te miały 9 na 10 lub 90% dopasowania. (upewnij się tylko, że jeśli szukam niebieskookiej blondynki, nie otrzymam wiadomości, że nie znaleziono żadnej, ale oto następne najbardziej pasujące, zawierające niebieskooką blondynkę z pasującym wynikiem 60%. To by było być bardzo niefajnym)
Jest więcej rzeczy, które wymagają rozważenia, jeśli zdecydujesz się podzielić tabelę, na przykład jak przechowywać atrybuty jako liczby, daty i tekst w jednej kolumnie? Czy są to oddzielne tabele lub kolumny. Nie ma łatwej odpowiedzi, czy to przy szerokim stole, czy przy podzielonych stołach.