2011-11-05 19 views
7

Czy są jakieś skalowalne sposoby wybierania tysięcy wierszy za pomocą mysql IN lub coś podobnego?Najbardziej efektywny sposób wybierania tysięcy wierszy z listy identyfikatorów

E.g.

SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) 

Czy to możliwe, czy tylko śnię? Schemat to InnoDB, można go zmienić, jeśli inny zapewnia bardziej skalowalne rozwiązanie.

W celach informacyjnych otrzymuję wyniki wyszukiwania z zestawu identyfikatorów zwracanych przez Solr. Chciałbym użyć mysql do ostatecznego wyszukiwania, ponieważ znacznie ułatwiłoby to sortowanie i końcowe filtrowanie wyników (nie będę rozumiał dlaczego).

Edycja:

Zapytanie może być użyty klauzuli ograniczyć, tak długo, jak długo w nadal zawierały wszystkie 100000 identyfikatorów

Np

SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) LIMIT 10; 
+1

lepiej użyć sortowania Solr, jeśli chcesz osiągnąć wydajność. – sathis

+0

Czy naprawdę musisz pobrać rzeczywistą zawartość wszystkich tysięcy wierszy? Nie możesz zrobić swojej paginacji, a potem zacząć pobierać na stronę? – cherouvim

+0

@cherouvim on musi zrobić sortowanie. Mówi, dlaczego wybiera wszystkie rekordy, które zakładam. – sathis

Odpowiedz

1

I tak było do mnie, i naprawdę nie wiedząc, ramy, należy spróbować wkładając te ID w tabeli tymczasowej i stosując tę ​​tabelę z prostym wewnętrzna przyłączyć. To może okazać się tak szybkie, jak to w IN.

+0

Zastanawiam się nad tym, ale czy nadpisywanie instrukcji INSERT w przypadku setek tysięcy identyfikatorów nie przeważyłoby nad korzyściami uzyskanymi z wewnętrznego sprzężenia? –

+0

Co ważniejsze, zazwyczaj istnieje górny limit wielkości (w znakach) pojedynczego zapytania SQL. Długa lista 'IN()' jest dobrym sposobem na osiągnięcie tego limitu. Użycie tabeli tymczasowej pozwala tego uniknąć. Ponadto rozwiązanie tabeli tymczasowej może być znacznie bardziej wydajne, jeśli chcesz użyć tej listy więcej niż raz. – sleske

+0

Który byłby prawdopodobnie przypadkiem, jeśli jest to wyszukiwanie, ponieważ możesz chcieć dokonać paginacji wyniku. – NoDataFound

0

Podjęłam to samo pytanie podczas wstawiania do tabel mysql. Możliwy rozmiar zapytania zależy od konfiguracji mysql.

Moje podejście polegało na dzieleniu kolekcji wielkich ids na części.

Korzystanie z Ruby on Rails:

all_ids.each_slice(10000) do |ids_part| 
    query = "INSERT INTO ..." 
end 

Może to być również rozwiązanie dla wyboru wierszy przez IDS.

Powiązane problemy