humman
20.06.2012, 19:41:01
witam
Czy zapytania z IN w przypadku dużej ilości danych są wydajne?
Co jest lepsze - użycie takiego zapytania, w którym IN(tutaj 10,000 id-ików) operujące na dużej ilości danych czyli sprawdzajace czy id (10,000 id-ików) znajduje się w np 1mln rekordów, czy lepiej jest zrobić zapytanie po ID zapisać wynik do tablicy a potem po pobraniu porównywać czy ID jest zgodny z tym pobranym i wtedy go wyświetlić?
Która opcja jest lepsza gdy dodatkowo dane trzeba posortować?
chodzi mi o zapytania typu;
SELECT *
FROM products, ...
WHERE pc.catID IN (4, 8, 9, 10, 11, 12, 13, 14, ...) AND ....
bpskiba
20.06.2012, 21:29:21
Według moich doświadczeń silnik mysql radzi sobie bardzo dobrze z przykładem, który podałeś (liczby stałoprzecinkowe w in)
Jeżeli na tej kolumnie będzie index powinno być dobrze.... myślę, że lepiej niż 1M powtórzeń pętli
........chociaż nigdy nie próbowałem wsadzić 10k liczb w nawias :]
To będzie wątek warty obserwacji
thek
21.06.2012, 01:09:26
To zależy jak się ma liczba elementów w IN w odniesieniu do wszystkich. A nuż jest ich tak dużo, że sensowniejsza jest inwersja i użycie NOT IN

Wszystko rozbija się jedynie o proporcję wybranych do wszystkich. Ogólnie jednak także duże ilości w bardzo dużym zestawie dadzą pewne przyspieszenie i takie podejście ma sens. Sam pamiętam jak w jednym z zapytań do serwisu jechało ich kilka tysięcy, ale było ono generowane query builderem w kohanie jako zastępnik ORDER BY rand() i skok wydajności (co nie jest dziwne) był znaczny.