ru_mysql (original) (raw)

Люди бодрые, помогите с поиском.

Предположим есть у нас таблица с велосипедами :)
Таблица состоит из следующих полей:
-> Айди
-> Брэнд
-> Модель
-> Количество колес
-> Количество скоростей
-> Наличие брызговиков (да/нет)
-> Рейтинг

как пример:
CREATE TABLE `SearchSimple` (
`ID` char(10) NOT NULL default '',
`Brend` int NOT NULL default 0,
`Wheel` tinyint(4) NOT NULL default '0',
`Speed` tinyint(4) NOT NULL default '0',
`SearchPos` double NOT NULL default '0',
PRIMARY KEY (`ID`),
KEY `Brend` (`Brend`,`Wheel`,`SearchPos`,`Speed`),
KEY `Brend_2` (`Brend`,`SearchPos`,`Speed`),
KEY `Wheel` (`Wheel`,`SearchPos`,`Speed`)
) ENGINE=MyISAM

В поиске участвуют следующие поля:
-> бренд - твердая привязка к конкретному бренду;
-> количество скоростей - интервал к примеру (от 5 до 30);

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

Количество записей в таблице - несколько миллионов.

На данный момент для поиска используется таблица, которая генерируется раз в сутки. То есть берем данные, уже отсортированные по рейтингу из главной таблицы, и загоняются в поисковую таблицу.

В поисковой таблице - устанавливаются индексы только на бренд и количество скоростей. То есть получаем уже отсортированные данные, в поисковом запросе используется только условие:
(где бренд = "ххх" и скоростей > 10 и скоростей < 20) + лимиты (с 20 по 40 - ю к примеру).

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

Дык вот собственно было придумано решение следующее. Хранить в таблицах поиска только поля, участвующие в поиске ну и само собой айди и рейтинг. Тогда отпадает необходимость переписывать таблицу полностью. по крону изменяем позиции, добавляем новые записи, удаляем.

Индекс делать следующим образом (бренд, рейтинг, скорости). Рейтинг вставлен вторым, не случайно. Дело в том, что в каждом запросе используется только интервал скоростей.

То есть получаем запрос (где бренд = "ххх" и колво скоростей в интервале от 10 до 20) сортировка по рейтингу + лимиты (с 20 по 40 к примеру).
В експлейне показывает Using where; Using index, все бы хорошо, но скорость выполнения запроса - где то 6 секунд.
Причем, результат запроса к примеру где количество педалей = 2 и марка = орленок и количество скоростей в интервале (от 1 до 5) - выполняется гораздо быстрее, чем где количество педалей = 2 и количество скоростей в интервале (от 1 до 5).

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

Вот собственно и вопрос. Как правильно сделать индекс, или распределить как то данные, а может мы велосипедисты, и можно как то все гораздо проще сделать?
Вобщем подпните на счет поиска пожалуйста в нужную сторону.

Заранее спасибо.