Подтвердить что ты не робот

Это сортировка php лучше, чем mysql "order by"?

Мне было интересно, если с точки зрения производительности и учета выбора mysql в таблице с очень очень многими ( > 1.000.000) записями, лучше отсортировать результаты с помощью sql "order by" или отсортировать результаты после запроса с помощью классический алгоритм сортировки программирования... у кого-то есть предложения?

Танки

4b9b3361

Ответ 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

Конечно, вы не захотите этого делать, если вы вернете более нескольких сотен строк.