22.01.2011, 22:10 | #1 |
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 254
|
Как сделать быструю сортировку в MySQL?
Что-то я туплю наверно. В общем проблема в следующем.
Например есть таблица книг и таблица авторов: Код:
CREATE TABLE book ( id int(11) NOT NULL AUTO_INCREMENT, pos decimal(6,2) NOT NULL, name varchar(255) NOT NULL, author_id int(11) NOT NULL, PRIMARY KEY (`id`), KEY `pos` (`pos`), KEY `author_id` (`author_id`) ); CREATE TABLE author ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ); Код:
SELECT book.name, author.name FROM book INNER JOIN author ON (book.author_id = author.id) WHERE book.pos > 10 ORDER BY book.pos ASC Проблема в том, что при сортировке по полю 'pos' не используется индекс - explain показывает "using filesort". Если не присоединять таблицу авторов, то все нормально, индекс используется. Как-нибудь можно в подобных банальных ситуациях задействовать при сортировке индекс? |
22.01.2011, 22:48 | #2 |
Эксперт
Регистрация: 12.12.2009
Адрес: Ростов-на-Дону
Сообщений: 1,537
Вес репутации: 247
|
Никак.
MySql не использует сортировку по индексу при JOIN-ах
__________________
Самый удобный Хостинг (в т.ч. сейчас - бесплатное полугодовое тестирование хостинга Node.JS) |
22.01.2011, 23:16 | #3 | |
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 254
|
eresik,
Цитата:
PS: Щас еще потестил. Вроде как если в таблице book индекс поля author_id сделать уникальным, то сортировка по индексу срабатывает. Но в данном примере это не актуально. |
|
23.01.2011, 06:02 | #4 | |
Магистр
Регистрация: 04.12.2007
Сообщений: 3,681
Вес репутации: 421
|
Цитата:
Но это мне так чуйка подсказывает. А как на самом деле- хз- пробовать надо и замерять..
__________________
|
|
23.01.2011, 10:40 | #5 |
Эксперт
Регистрация: 12.12.2009
Адрес: Ростов-на-Дону
Сообщений: 1,537
Вес репутации: 247
|
Ничего страшного в джоинах нет, если их несколько штук (а не десятки), или если таблицы небольшие (не миллионные).
На PHP что-то "прикручивать" в любом случае однозначно дороже будет.
__________________
Самый удобный Хостинг (в т.ч. сейчас - бесплатное полугодовое тестирование хостинга Node.JS) |
23.01.2011, 12:42 | #6 | ||
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 254
|
Йода,
Цитата:
eresik, Цитата:
Йода Конкретно сейчас у меня проблема обнаружилась в определении "предыдущего" и "следующего" узла в динамически-отсортированном списке. Для этого я делал запрос с выборкой элементов с position больше (меньше), чем у текущего элемента, с сортировкой по полю position и limit 1. В джанго я использовал select_related(), который во втором джоине тянул авторов (а этот второй джоин и портил сортировку), причем авторы мне на этом шаге были не нужны. Я тогда убрал второй джоин, сделав select_related(depth=1). Веременные таблицы и filesort убрались. И о чудо - скорость открытия таких страниц возрасла почти в два раза. На одиночных запросах разница не заметна, а вот когда 100 человек одновременно сайт просматривают, разница оказалась существенной, особенно там, где у элемента соседей много. |
||
23.01.2011, 12:47 | #7 |
Эксперт
Регистрация: 12.12.2009
Адрес: Ростов-на-Дону
Сообщений: 1,537
Вес репутации: 247
|
Ни разу не сталкивался, чтоб на стороне скрипта что-то выполнилось быстрее, чем если ту же работу поручить MySQL (хотя наверное всяко бывает)
__________________
Самый удобный Хостинг (в т.ч. сейчас - бесплатное полугодовое тестирование хостинга Node.JS) |
23.01.2011, 14:01 | #8 | |
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 254
|
eresik,
Цитата:
Йода предварительно загрузить авторов в хэш будет работать очень быстро: к автору можно будет очень быстро обращаться $autors[$author_id]->name. Но конечно надо баланс соблюдать. |
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Таки опять просьба сделать сортировку УРЛов в проекте | CloverLeaf | Пожелания пользователей системы | 2 | 04.05.2010 01:34 |
Как бы сообразить сортировку по зонам? | Константин | Пожелания пользователей системы | 2 | 17.04.2008 18:55 |
Верните сортировку по ценам | rilian | Пожелания пользователей системы | 15 | 18.12.2007 02:04 |
Добавить ручную сортировку | Frost Bite | Пожелания пользователей системы | 0 | 23.11.2007 16:46 |
Часовой пояс GMT +3, время: 18:19.