Поиск по интервалу + сортировка

serglt

Анус, ой, Ахтунг
Поиск по интервалу + сортировка

Всем доброго времени суток. в общем ситуация такая

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

как пример:
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);
-> количество колес

Причем количество скростей учавствует в каждом поиске и задается как интервал.
KEY `Brend_2` (`Brend`,`SearchPos`,`Speed`)
select ID from SearchSimple where Brend = 'orlionok' and Speed between 10 and 20 order by SearchPos limit 10, 10;
Запрос выше выполняется быстро. И это понятно, в таблице находится десяток орленков, и индекс замечательно работает.
KEY `Brend` (`Brend`,`Wheel`,`SearchPos`,`Speed`)
select ID from SearchSimple where Brend = 'orlionok' and Wheel = 2 and Speed between 10 and 20 order by SearchPos limit 10, 10;
Выполняется еще быстрее.

Но вот если мы возьмем следующий запрос
select ID from SearchSimple where Wheel = 2 and Speed between 10 and 20 order by SearchPos limit 10, 10;
запрос будет выполняться ококло 6 - 7 секунд. И с этим тоже все ясно, по индексу Wheel таблица разбита на немного частей, но 2 - х колесных велосипедов - большинство, и получается что на каждую выборку приходится пробегать по индексу и заглядывать в каждой записи индекса за поле SearchPos для просмотра Speed. А это уже для двух колесных велосипедов как минимум половина таблицы.
Все запросы в експлейне показывают что используют индекс и условия (без темпов и сортировок в файле).
Дык вот собственно и вопрос, как же быть с последним запросом. Может я не правильно индекс составляю, или есть какое то другое решение. На данный момент получается: чем больше условие, тем быстрее выборка.

Может какой поисковый движок посоветуете для этого случая, так как это наглядный пример, в нашем поиске полей конечно гораздо больше и интервалов может быть тоже больше. Айди не автоинкремент. SearchPos - изменяемое поле.

Заранее благодарен
 

prolis

Новичок
три составных индекса тут не нужны, их нужно удалить.
Один составной может быть по полям "бренд" и "количество скоростей"
("Все запросы в експлейне показывают что используют индекс") - не все индексы одинаково полезны. Индекс имеет свойство "селективность" - грубо говоря количество уникальных значений к общему числу записей таблицы, потому включение поля "количества колёс" не повысит производительность, а включение поля "позиция в поиске" не влияет скорость выборки запроса.
Для включения составного индекса в последний запрос придется поплясать с бубном (добавлять в запрос поле или прописывать хинт). Так что попробуй.
 

Breeze

goshogun
Команда форума
Партнер клуба
KEY `BSWSpos` (`Brend`,`Speed`,`Wheel`,`SearchPos`)

в твоих запросах ключ Brend бесполезен практически.

а вообще меня терзают смутные сомнения на счет необходимости этой таблицы и индекса именно по ней.
ИМХО проще сделать индекс по полям `ID`,`Brend`,`Speed`,`Wheel`,`SearchPos` в основной таблице, тогда поиск будет идти чисто по индексу. Еще и место сэкономится за счет отсутствующей таблицы.
это в теории, на практике проверить можешь только ты )
 

serglt

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

Похоже проблемма решилась, сама собой, оказалось что когда делали тесты сервер был очень сильно нагружен другими процессами. Сегодня попробовали еще раз, все летает, пока что больше 0.1 сек выполнения небыло.
В таблице 2 500 000 записей. И это самые трудоемкие запросы, индекс у которых KEY `Wheel` (`Wheel`,`SearchPos`,`Speed`)
если два последних поля поменять местами - 11 секунд из за файловой сортировки.

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

Может кто нить знает какую нибудь поисковую систему, в которой можно было бы использовать интервалы, сортировки, ну и фильтры - текстовые, числовые

Подпните в нужную сторону. заранее благодарен.
 

serglt

Анус, ой, Ахтунг
Вобщем попробовал извратится со sphinx'ом
Speed = sql_type_uint
SearchPos = sql_type_uint
И ко всем фиксированным параметрам в запросе индексации приписывал префиксы
типа КЕЛЕСА_, МАРКА_, ФИРМА_
ну и при поиске к параметрам добавлял эти префиксы. Результат порадовал.
Возможно, этот вариант и останется. Жду критику от вас господа.
 
Сверху