znaczacy > comp.* > comp.bazy-danych

Mik (27.11.2008, 13:47)
Witam ponownie... i ponownie pewnie z bardzo prostym pytaniem:

co jest wydajniejsze:
mysql> explain (select * from podsumowanie where partnerid in (select id from partnerzy where aktywny='1'));
+----+--------------------+--------------+-----------------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------------+-----------------+---------------+---------+---------+------+------+-------------+
| 1 | PRIMARY | podsumowanie | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 2 | DEPENDENT SUBQUERY | partnerzy | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using where |
+----+--------------------+--------------+-----------------+---------------+---------+---------+------+------+-------------+
2 rows in set (0.00 sec)

mysql> explain(select p.id , po.* from partnerzy p, podsumowanie po where p..aktywny='1' and po.partnerid=p.id);
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | po | ALL | PRIMARY | NULL | NULL | NULL |2 | |
| 1 | SIMPLE | p | ALL | PRIMARY | NULL | NULL | NULL |3 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
2 rows in set (0.00 sec)

niestety nie wiem jak zinterpretowac wyniki :( Wyglada na to, ze 1
wersja testuje 6 wierszy, druga 5. Dobrze to rozumiem?
Moze jest jakies lepsze rozwiazanie?

dzieki i pozdrawiam
Mik
wloochacz (27.11.2008, 13:56)
Mik pisze:
> Witam ponownie... i ponownie pewnie z bardzo prostym pytaniem:
> co jest wydajniejsze:
> mysql> explain (select * from podsumowanie where partnerid in (select id from partnerzy where aktywny='1'));

To:
select A.*
from podsumowanie A
inner join partnerzy B on (B.id = A.partnerid and B.aktywny = 1)
Piotr Keplicz (27.11.2008, 14:04)
Mik:
> niestety nie wiem jak zinterpretowac wyniki :( Wyglada na to, ze 1
> wersja testuje 6 wierszy, druga 5. Dobrze to rozumiem?


Nie do konca. Nalezy porwnywac iloczyn podanych liczb wierszy, nie sume.

..pk.
Mik (27.11.2008, 14:09)
Dnia Thu, 27 Nov 2008 12:56:15 +0100
wloochacz <nospam.wloochacz> napisal(a):

> Mik pisze:
> To:
> select A.*
> from podsumowanie A
> inner join partnerzy B on (B.id = A.partnerid and B.aktywny = 1)


Dzieki wielkie:)

Pki co na mojej minibazie testowej wykonuja sie tak samo, ale
mam lacznie po 3 wiersze/tabele:) Musze sie nauczyc jak
bardziej jeszcze optymalizowac zapytania... Myslalem, ze sporo umiem,
ale jak zwykle wyszlo, ze za malo.

pozdrawiam
Mik
Mik (27.11.2008, 14:14)
Dnia Thu, 27 Nov 2008 13:04:37 +0100
Piotr Keplicz <keplicz> napisal(a):

> Mik:
> > niestety nie wiem jak zinterpretowac wyniki :( Wyglada na to,ze 1
> > wersja testuje 6 wierszy, druga 5. Dobrze to rozumiem?

> Nie do konca. Nalezy porwnywac iloczyn podanych liczb wierszy, nie
> sume.
> .pk. A wlasnie:) Fakt.


select * from podsumowanie where partnerid in (select id from partnerzy
where aktywny='1') - 3 (wczesniej podalem 6.. ale cos mi sie
popieprzylo)

Czyli:
mysql> explain(select * from podsumowanie where partnerid in (select id from partnerzy where aktywny='1'));
+----+--------------------+--------------+-----------------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------------+-----------------+---------------+---------+---------+------+------+-------------+
| 1 | PRIMARY | podsumowanie | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 2 | DEPENDENT SUBQUERY | partnerzy | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using where |
+----+--------------------+--------------+-----------------+---------------+---------+---------+------+------+-------------+
2 rows in set (0.00 sec)

mysql> explain(select A.* from podsumowanie A inner join partnerzy B on(B.id = A.partnerid and B.aktywny = 1));
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | A | ALL | PRIMARY | NULL | NULL | NULL |2 | |
| 1 | SIMPLE | B | ALL | PRIMARY | NULL | NULL | NULL |3 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
2 rows in set (0.00 sec)

iloczyn rows dla pierwszego zapytania to 2, dla drugiego to 6... Czy
iloczyn jest wyznacznikiem optymalnosci? Sorki, za pewnie glupie
pytania, ale... to pierwszy raz, jak staram sie dosc mocno
zoptymalizowac bazy/zapytania.
Piotr Keplicz (27.11.2008, 14:31)
Mik:
> iloczyn rows dla pierwszego zapytania to 2, dla drugiego to 6... Czy
> iloczyn jest wyznacznikiem optymalnosci? Sorki, za pewnie glupie
> pytania, ale... to pierwszy raz, jak staram sie dosc mocno
> zoptymalizowac bazy/zapytania.


Polecam lekture manuala. Iloczyn liczby wierszy przeklada sie na szybkosc, ale trzeba patrzec na poszczeglne wartosci w odniesieniu do liczby wierszy w tabelach. Wtedy jasno widac, kiedy MySQL musi przeskanowac wszystkie wiersze, a kiedy korzysta z indeksw i jakich.

..pk.
wloochacz (27.11.2008, 14:41)
Mik pisze:
[ciach]
> Dzieki wielkie:)
> Pki co na mojej minibazie testowej wykonuja sie tak samo, ale
> mam lacznie po 3 wiersze/tabele:) Musze sie nauczyc jak
> bardziej jeszcze optymalizowac zapytania... Myslalem, ze sporo umiem,
> ale jak zwykle wyszlo, ze za malo.

Jesli chcesz cokolwiek optymalizowac, to zadbaj o odpowiednia prbe
danych - im wiecej tym lepiej, ale najlepiej tyle i o takim rozkladzie
jaki bedzie w systemie produkcyjnym.
Bo po co optymalizowac cos, co zawiera 6 wierszy??
Rafal\(sxat\) (27.11.2008, 14:56)
Uytkownik "Mik" <aleextra> napisa w wiadomoci
news:@mik
Witam ponownie... i ponownie pewnie z bardzo prostym pytaniem:

co jest wydajniejsze:
mysql> explain (select * from podsumowanie where partnerid in (select id
from partnerzy where aktywny='1'));

unikaj podzapytan jesli mozesz... to nie jest szybkie zwlaszcza jezeli
podzapytanie generuje mase wynikow.... np powyzej 100 juz jest wolne...

select podsumowanie.* from podsumowanie
left join partnerzy on partnerzy.id=podsumowanie.partnerid
where partnerzy.aktywny=1

(przy 1000 pozycji zadziala szybciej niz to powyzej biorac pod uwage ze
aktywnych partnerow jest wiecej)

Raf
Rafal\(sxat\) (30.11.2008, 23:23)
>Pki co na mojej minibazie testowej wykonuj si tak samo, ale
>mam cznie po 3 wiersze/tabel:) Musz si nauczy jak
>bardziej jeszcze optymalizowa zapytania... Mylaem, e sporo umiem,
>ale jak zwykle wyszo, e za mao.


3 wiersza i optymalizacja zapytan? to nie jest pytanie podchwytliwe? - sadze
ze zwykly plik tekstowy by sie sprawdzil lepiej ;)

Raf
Podobne wtki