Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Długo wykonujące się zapytanie SELECT
owen
post 24.11.2013, 16:32:15
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.11.2005

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
mmmmmmm
post 24.11.2013, 18:40:10
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mmmmmmm 24.11.2013, 18:41:46
Go to the top of the page
+Quote Post
owen
post 27.11.2013, 10:01:48
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.11.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mmmmmmm
post 27.11.2013, 11:55:16
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Musisz używać LIKE?
Go to the top of the page
+Quote Post
owen
post 27.11.2013, 12:28:01
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.11.2005

Ostrzeżenie: (0%)
-----


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!
Go to the top of the page
+Quote Post
Greg23
post 3.12.2013, 18:24:03
Post #6





Grupa: Zarejestrowani
Postów: 120
Pomógł: 0
Dołączył: 6.04.2012

Ostrzeżenie: (0%)
-----


Ja dla dużych baz używam wyszukiania pełnotekstowego, możesz sobie też poczytać o SPHINX-ie.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 14:15