2011-12-27 5 views
14

Mam kwerendy SQL, która używa wartości tablicy w klauzuli WHERE:Ile wartości w klauzuli "w" jest zbyt wiele w zapytaniu SQL?

$ids = array 
     ( 
      [0] => 1 
      [1] => 2 
      [2] => 5 
     ) 

$ids = join(',',$ids); 
$sql = "SELECT * FROM cats WHERE id IN ($ids)"; 


Moje pytanie brzmi, ile identyfikatory są zbyt wiele?
Czy wpłynie to na prędkość?

Dzięki wszystkim

+0

Wszystko zależy od struktury tabeli i indeksów. I oczywiście, jak twierdził Siergiej, im wolniej. – Aknosis

+0

możliwy duplikat [liczby MySQL pozycji w "klauzuli"] (http://stackoverflow.com/questions/1532366/mysql-number-of-items-within-in-clause) –

Odpowiedz

0

Im więcej wartości, które wprowadzone do IN, tym wolniej będzie działać, oczywiście.

"Ile jest za dużo" jest funkcją wielu czynników. Na przykład twój rozmiar zestawu danych. Lub jak wygląda reszta twojego zapytania.

4

Im więcej wybierzesz danych, tym dłużej to zajmie, ale Twoim głównym problemem nie powinna być liczba identyfikatorów, które wybierzesz. Zamiast tego należy upewnić się, że identyfikator ma numer INDEX lub że jest to PRIMARY KEY. To sprawi, że wyszukiwanie będzie szybkie, bez względu na to, ile ids grab you chwytasz.

+1

Generalnie tak. Ale jeśli połączysz 'IN' z' ORDER' i 'LIMIT', pojawi się problem z dużymi zbiorami danych. –

0

Pomyśl o ... jeśli musisz napisać 5 stron lub 10, co zajmuje więcej czasu ... to normalne, jeśli masz dużą liczbę identyfikatorów, aby dłużej czekać na zapytanie. Powinieneś wyglądać i zapewnić, że twoje dane nie będą się powtarzać ponieważ spowoduje to, że zapytanie będzie trwało dłużej dla niepotrzebnych danych.

5

Oracle ma limit 1000, który wcześniej trafiłem. MySQL nie wydaje się mieć nic przeciwko. Najlepszym rozwiązaniem nie jest użycie klauzuli IN dla tego dużego zestawu danych. Skąd pochodzą ids? Jeśli z tego samego DB, sprawdź, czy możesz użyć podkwerendy zamiast tego wyszukiwania na podstawie jednego parametru, np. userid, aby znaleźć powiązane identyfikatory. Będzie to znacznie bardziej efektywne, ponieważ MySQL może wewnętrznie łączyć przy użyciu indeksów.

Powiązane problemy