Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [optymalizacja] Select Where IN( Select)
mkozak
post
Post #1





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Czesc miszcze od MySql-a,

Mam zagwostkę i pytanie. Here is situation.

Zapytanie :
  1. SELECT count( id ) FROM stats WHERE serviceid
  2. IN ( SELECT id FROM services WHERE name LIKE 'wp%' GROUP BY id)


Tabela stats ma około 70 MB i szczerze powiedziawszy jest kiepsko zoptymalizowana.
Nie starczyło mi cierpliwości, żeby sprawdzić jak długo wykonuje się to zapytanie.

Jeżeli wykonuję je osobno tzn:
  1. SELECT id FROM services WHERE name LIKE 'wp%' GROUP BY id


dostaje 32 rzędy w 0.00 sec

  1. SELECT count( id ) FROM stats WHERE serviceid


dostaje odpowiedź w 0.00 sec

jeżeli wezmę oszukam całą procedurę i wstawie do IN wynik zapytania:
  1. SELECT count( id ) FROM stats WHERE serviceid
  2. IN (60,65,66,67,68,69,70,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,165,166,167,271)


dostaję odpoeidź w 0.42 sec

Pytanie - dlaczego wykonanie dwóch selectów na raz trwa nieskończenie dłużej niż takie "oszukanie" zapytanie z IN-em??

Jak można przekonać optymalizera MySQL-owego do poprwnej interpretacji??
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sh4dow
post
Post #2





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


z jednej strony prawdopodobnie brakuje indeksów, ale z drugiej prawdopodobnie tworzenie tymczasowej tablicy zamula serwer. pewnie robi jakis zlaczenie tablic zeby pozniej wybrac z nich dane. Chociaz moge sie mylic.
Go to the top of the page
+Quote Post
mkozak
post
Post #3





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Cytat(Sh4dow @ 1.03.2007, 13:51:18 ) *
z jednej strony prawdopodobnie brakuje indeksów, ale z drugiej prawdopodobnie tworzenie tymczasowej tablicy zamula serwer. pewnie robi jakis zlaczenie tablic zeby pozniej wybrac z nich dane. Chociaz moge sie mylic.



No i to jest ciekawa teoria, bo jeżeli staram się wysterować optymalizera dając SQL_SMALL_RESULT co teoretycznie zmniejsza wielkość tablicy - nie daje żadnego efektu.

Z poprzednimi ripostami iż "brak indexów, albo coś" jakoś się nie zgodzę - przypominam iż osobno zapytania wykonują się bardzo szybko - a na obu tabelach pola id są indexami.

A name jest typu varchar(20)

Ktoś tam prosił o explain
  1. +----+--------------------+----------+------+---------------+------+---------+------+--------+-------------+
  2. | id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
  3. +----+--------------------+----------+------+---------------+------+---------+------+--------+-------------+
  4. | 1 | PRIMARY | stats | ALL | NULL | NULL | NULL | NULL | 458920 | USING WHERE |
  5. | 2 | DEPENDENT SUBQUERY | services | ALL | NULL | NULL | NULL | NULL | 275 | USING WHERE |
  6. +----+--------------------+----------+------+---------------+------+---------+------+--------+-------------+


  1. SELECT count( services.id ) FROM stats, services WHERE stats.serviceid = services.id AND name LIKE 'wp%'


Natomiast to zapytanie wykonuje sie bardzo optymalnie - 0.17 sec - dzieki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) - ale jak wyjaśnić tą zagwostkę iż z sub selectem jest niewspółmiernie dłużej niż z podanymi wartosciami.

Ten post edytował mkozak 2.03.2007, 13:05:29
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 30.12.2025 - 17:03