Сортировка php лучше, чем mysql "order by"? - PullRequest
25 голосов
/ 01 сентября 2010

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

Танки

Ответы [ 5 ]

22 голосов
/ 01 сентября 2010

MySQL, руки вниз. Он оптимизирован для этого и может использовать индексы. Это было бы ужасно делать в PHP (и вы бы быстро достигли memory_limit).

18 голосов
/ 01 сентября 2010

Вы сравниваете систему с методами, реализованными в оптимизированном C, предназначенном для выполнения именно этой задачи, с другой, которую вы собираетесь реализовать на интерпретируемом языке сценариев.

По сути, все, что написано на C, этобудет намного быстрее, чем эквивалентная функция, написанная на PHP, в 10-100 раз.

Как уже отмечалось, нет никаких сомнений в том, что гораздо эффективнее правильно настроить вашу БД и позволитьэто делает работу.

12 голосов
/ 01 сентября 2010

MySQL победит.Еще одна причина, помимо перечисленных, состоит в том, что, если записи уже находятся в БД, вам не нужно копировать их из БД для их сортировки.И подкачка или субиндексирование их будет легко и автоматически оптимизироваться.

Короче говоря, если БД МОЖЕТ сделать это, БД ДОЛЖЕН сделать это, почти всегда.

10 голосов
/ 01 сентября 2010

В гипотетическом случае, когда вы на самом деле получаете записи в памяти вашего приложения, mysql все равно превзойдет ваши приложения, потому что, если вы настроили базу данных правильно, сортировка не будет.

Если вы хотите сделать заказ в таблице из 1 записи Mio, вы должны указать индекс, который обычно будет реализован в виде B-дерева, через которое Mysql может проходить и получать отсортированные результаты.

4 голосов
/ 01 июня 2013

Иногда, если вы можете избежать «Использование временного; Использование файловой сортировки», оно того стоит, хотя я не проводил подробного тестирования.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...