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

Z punktu widzenia wydajności, jak efektywne jest użycie tymczasowej tabeli MySQL dla często używanej funkcji witryny?

To, co podałeś, jest całkowicie poprawne, tabela tymczasowa będzie widoczna tylko dla bieżącego użytkownika/połączenia. Mimo to istnieje kilka ogólnych problemów i kilka innych problemów, takich jak:

  • Dla każdego z tysięcy wyszukiwań, które zamierzasz utworzyć i wypełnić tę tabelę (i usunąć ją później) — nie według użytkownika, według wyszukiwania. Ponieważ każde wyszukiwanie najprawdopodobniej ponownie wykona skrypt, a "na sesję" nie oznacza sesji PHP - oznacza sesję bazy danych (otwarte połączenie).
  • Będziesz potrzebował CREATE TEMPORARY TABLES przywilej, który możesz nie mam.
  • Mimo to ta tabela naprawdę powinna mieć typ MEMORY, który kradnie pamięć RAM bardziej niż wygląda. Ponieważ nawet mając VARCHAR, tabele MEMORY wykorzystują pamięć wierszy o stałej długości.
  • Jeśli twoja heurystyka później będzie musiała odwoływać się do tej tabeli dwukrotnie (np. SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ... ) - nie jest to możliwe w przypadku tabel MEMORY.

Następnie łatwiej byłoby dla Ciebie – a także dla bazy danych – dodać LIKE '%xyz%' bezpośrednio do Twoich images tabele WHERE klauzula. Zrobi to samo bez dodatkowych kosztów związanych z tworzeniem TABELI TEMP i dołączaniem do niej.

W każdym razie - nieważne w którą stronę pójdziesz - to GDZIE będzie strasznie wolno. Nawet jeśli dodasz indeks na images.name najprawdopodobniej będziesz potrzebować LIKE '%xyz%' zamiast LIKE 'xyz%' , aby indeks nie był używany.

Nie. :)

Opcje alternatywne

MySQL ma wbudowane pełnotekstowe wyszukiwanie (od wersji 5.6 również dla InnoDB), który nawet może dać ci taką punktację:Gorąco polecam przeczytanie i wypróbowanie. Możesz być pewien, że baza danych wie lepiej od Ciebie, jak skutecznie przeprowadzić wyszukiwanie.

Jeśli zamierzasz używać MyISAM zamiast InnoDB, pamiętaj o często pomijanym ograniczeniu polegającym na tym, że wyszukiwanie FULLTEKST zwraca cokolwiek tylko wtedy, gdy liczba wyników jest mniejsza niż 50% łącznej liczby wierszy tabeli.

Inne rzeczy, na które możesz chcieć spojrzeć, to na przykład Solr (Ładne wprowadzenie do tego tematu byłoby początkiem http://en.wikipedia.org/wiki/Apache_Solr ). Używamy go w naszej firmie i wykonuje świetną robotę, ale wymaga sporo nauki.

Podsumowanie

Samo rozwiązanie obecnego problemu (wyszukiwanie) polega na użyciu funkcji PEŁNEGO TEKSTU.

Aby podać liczbę, 10 000 połączeń na sekundę nie jest już "trywialne" - przy setkach tysięcy wyszukiwań na sekundę problemy z wydajnością, które napotkasz, są wszędzie w Twojej konfiguracji. Będziesz potrzebować kilku serwerów, równoważenia obciążenia i mnóstwa innych niesamowitych technicznych bzdur. A jednym z nich będzie na przykład Solr;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Transakcja MySQL:SELECT + INSERT

  2. Co to jest PyMySQL i czym różni się od MySQLdb? Czy może to wpłynąć na wdrożenie Django?

  3. Wstaw/wyświetl obraz do/z bazy danych MySQL

  4. Proste zrozumienie błędów MySQL

  5. Obliczanie odległości Haversine między dwoma punktami w Laravel