Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porady potrzebne do prawidłowego zindeksowania tabeli z wieloma polami do przeszukania

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak załadować Individual Div bez wczytywania całej strony i wyświetlić stan wczytywania?

  2. Jak mogę zresetować domyślne zachowanie użytkownika root w MySQL 5.7?

  3. Jak policzyć liczbę wystąpień określonego słowa w tekście blob MySQL?

  4. Zmiana kodowania znaków MySQL. Czy zachowana jest integralność danych?

  5. Jak dodać opcję do sql_mode w MySQL bez utraty istniejących ustawień?