Это сортировка php лучше, чем mysql "order by"?
Мне было интересно, если с точки зрения производительности и учета выбора mysql в таблице с очень очень многими ( > 1.000.000) записями, лучше отсортировать результаты с помощью sql "order by" или отсортировать результаты после запроса с помощью классический алгоритм сортировки программирования... у кого-то есть предложения?
Танки
Ответы
Ответ 1
Вы сравниваете систему с методами, реализованными в оптимизированном C, предназначенном для выполнения именно этой задачи, с другой, которую вы собираетесь реализовать на интерпретируемом языке сценариев.
В принципе, все, что написано на C, будет намного быстрее, чем эквивалентная функция, написанная на PHP, в 10 - 100 раз.
Как уже отмечалось, нет никаких сомнений в том, что гораздо эффективнее правильно настроить вашу БД и позволить ей выполнять эту работу.
Ответ 2
mySQL, руки вниз. Он оптимизирован для этого и может использовать индексы. Это было бы ужасно сделать в PHP (и вы быстро достигнете memory_limit
).
Ответ 3
В гипотетическом случае, когда вы действительно получаете записи в памяти вашего приложения, mysql по-прежнему будет бить штаны вашего приложения, потому что, если вы настроили базу данных правильно, она НЕ будет сортировать.
Я хочу заказать в таблице из 1 записей Mio, вы бы указали в индексе, который обычно будет реализован как B-Tree, где Mysql может пройти и получить отсортированные результаты.
Ответ 4
MySQL победит. Еще одна причина, кроме других, состоит в том, что, если записи уже находятся в БД, вам не нужно их копировать из БД для их сортировки. И пейджинговые или субиндексирующие их будут легко и оптимизированы автоматически.
Короче говоря, если БД МОЖЕТ это сделать, БД ДОЛЖНО делать это почти всегда.
Ответ 5
Иногда, если вы можете избежать "Использовать временный, используя файловый порт", это того стоит, хотя я не проводил обширного тестирования.
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
Вместо того, чтобы просить mysql сортировать по имени, в ruby я делаю
results.sort_by {|u| u.name.downcase}
Полученный в результате запрос mysql теперь проще:
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
Конечно, вы не захотите этого делать, если вы вернете более нескольких сотен строк.