Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Długo wykonujące się zapytanie SELECT
Forum PHP.pl > Forum > Bazy danych > MySQL
owen
Witam,

Mam pewien problem z poniższym zapytaniem SELECT, które wykonuje mi się około 2 sekund. Aktualnie tabela data ma około 3 miliony rekordów natomiast tabela website ma jedynie 10. Aktualnie co udało mi się zrobić to dodałem indeksy w tabeli, ale wykonywanie zapytania się nie skróciło (explain pokazuje, że są używane indeksy, indeksy nałożyłem na tabelę data, dla kolumn stamp i companyId. W przyszłości baza będzie miała jeszcze więcej rekordów oraz klientów którzy będą korzystać ze strony dlatego tak ważne jest zoptymalizowanie tego zapytania.

  1. SELECT
  2. b.name,
  3. d.companyId,
  4. SUM(negative) total_neg,
  5. SUM(positive) total_pos,
  6. ROUND(100-(100/(SUM(negative)+SUM(positive))*SUM(negative))) health
  7. FROM DATA d INNER JOIN website b USING(companyId)
  8. WHERE
  9. stamp LIKE ?
  10. AND
  11. d.companyId = ?


Problem może leżeć w źle nadanych indeksach ?

Z góry dzięki za pomoc!
mmmmmmm
Masz źle napisane zapytanie.
http://forum.php.pl/index.php?showtopic=22...p;#entry1074645
pkt 4.

EDIT:
Poza tym przy takiej ilości rekordów czas na zmianę DBMS. Np. na całkiej przyjemnego, a w tej samej cenie postgreSQL-a.
owen
Dzieki mmmmmmm za odpowiedz.

Dodalem do zapytania GROUP BY companyId. Utworzylem indeks na data(companyId, positive, negative), kiedy uzyje zapytania z explain dostaje

  1. id select_type TABLE type possible_keys KEY key_len ref rows Extra
  2. 1 SIMPLE d ref index_companyId index_companyId 8 const 2557037 USING WHERE; USING INDEX
  3. 1 SIMPLE b ALL \N \N \N \N 7 USING WHERE


a zapytanie teraz wyglada tak:

  1. SELECT
  2. b.name,
  3. d.companyId,
  4. SUM(negative) total_neg,
  5. SUM(positive) total_pos,
  6. ROUND(100-(100/(SUM(negative)+SUM(positive))*SUM(negative))) health
  7. FROM DATA d INNER JOIN website b USING(companyId)
  8. WHERE
  9. stamp LIKE ?
  10. AND d.companyId = ?
  11. GROUP BY companyId;


Wykonanie takiego zapytania zajmuje okolo 3 sek. Jest jakas mozliwosc optymalizacji bez koniecznosci zmiany DBMS ?

Dzieki
mmmmmmm
Musisz używać LIKE?
owen
Właśnie zauważyłem, że zapytanie z LIKE wykonuje się bardzo długo. Zamieniłem to na stamp >= '2013-11-27' i wszystko się wyjaśniło biggrin.gif Dzięki za pomoc!
Greg23
Ja dla dużych baz używam wyszukiania pełnotekstowego, możesz sobie też poczytać o SPHINX-ie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.