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 - изменяемое поле.
Заранее благодарен
Всем доброго времени суток. в общем ситуация такая
Предположим есть у нас таблица с велосипедами

Таблица состоит из следующих полей:
-> Айди
-> Брэнд
-> Модель
-> Количество колес
-> Количество скоростей
-> Позиция в поиске
как пример:
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 - изменяемое поле.
Заранее благодарен