2010-09-01 8 views
22

Zastanawiam się, czy pod względem wydajności i biorąc pod uwagę wybór mysql na tabeli z bardzo bardzo wieloma rekordami (> 1.000.000), lepiej sortuje wyniki za pomocą sql "order by" lub sortuje wyniki po zapytaniu klasycznym algorytm sortowania programów ... ktoś ma jakieś sugestie?jest php sortować lepiej niż mysql "zamówienie przez"?

Zbiorniki

+1

Wygląda na to, że nie masz pojęcia, co to jest baza danych. Nie jest to prosty kontener, taki jak zwykły plik tekstowy, jak zapewne myślisz. Jest to oprogramowanie do manipulacji danymi. Zaprojektowany do zamawiania, filtrowania, agregowania i wiele więcej. Podczas gdy PHP nie jest oprogramowaniem do obróbki danych, ale preprocesorem hipertekstowym jest –

Odpowiedz

14

Porównujesz system z metodami zaimplementowanymi w zoptymalizowanym C, przeznaczonym do wykonania dokładnie tego zadania, z innym, który zamierzasz wdrożyć w zinterpretowanym języku skryptowym.

Zasadniczo, wszystko napisane w C będzie dużo szybciej niż podobnej funkcji napisany w PHP, o współczynnik 10 do 100.

Jak już wspomniano, nie ma mowy w ogóle, że jest daleko bardziej wydajne, aby poprawnie skonfigurować bazę danych i pozwolić jej pracować.

20

mySQL, zręczny. Jest zoptymalizowany do tego celu i może korzystać z indeksów. Byłoby to okropne w PHP (i szybko osiągnąłbyś numer memory_limit).

10

W hipotetycznym przypadku, w którym faktycznie otrzymasz zapisy w pamięci aplikacji, mysql będzie nadal pobijał spodnie Twojej aplikacji, ponieważ jeśli skonfigurujesz bazę danych, nie będzie MUSI jej sortować.

Chciałbym zamówić w tabeli 1 rekordów Mio, można podać w indeksie, który byłby zwykle zaimplementowany jako B-Tree, w którym Mysql może przejść i uzyskać posortowane wyniki.

10

MySQL wygra. Jeszcze jeden powód, oprócz innych wymienionych, jest taki, że zakładając, że zapisy są już w DB, nie musisz ich kopiować z DB, aby je posortować. A stronicowanie lub subindeksowanie ich będzie łatwe i zoptymalizowane automatycznie.

Krótko mówiąc, jeśli DB MOŻE to zrobić, DB POWINIEN to zrobić, prawie zawsze.

+2

+1 - Przesyłanie danych do tego typu będzie znacznie droższe niż w bazie danych. –

3

Czasami, jeśli można uniknąć "Korzystanie z tymczasowego, Korzystanie z filesort" warto, choć nie przeprowadziłem obszernych testów.

1 SIMPLE favorites ref source_id,user2_id source_id 3 const 137 Using index; Using temporary; Using filesort 
1 SIMPLE users eq_ref PRIMARY,updated PRIMARY 3 apm.favorites.target_id 1 Using where 

Zamiast pytać mysql aby posortować według nazwy, w Ruby zrobić

results.sort_by {|u| u.name.downcase} 

Powstały zapytania mysql jest teraz prostsze:

1 SIMPLE favorites ref source_id,user2_id source_id 3 const 137 Using index 
1 SIMPLE users eq_ref PRIMARY,updated PRIMARY 3 apm.favorites.target_id 1 Using where 

Oczywiście, że nie chcą zrób to, jeśli zwróciłeś więcej niż kilkaset wierszy.

Powiązane problemy