|
|
|
| Есть такая таблица
CREATE TABLE IF NOT EXISTS `prod` (
`prod_desc_id` tinyint(2) unsigned NOT NULL default '0',
`post_id` int(10) unsigned NOT NULL default '0',
`money` mediumint(6) unsigned NOT NULL default '0',
`user_id` mediumint(6) NOT NULL default '0',
`unixdate` int(10) NOT NULL default '0',
PRIMARY KEY (`unixdate`,`user_id`,`prod_desc_id`,`post_id`),
KEY `fight_id` (`post_id`),
KEY `prod_desc_id` (`prod_desc_id`),
KEY `unixdate` (`unixdate`),
KEY `user_id` (`user_id`),
KEY `money` (`money`)
) ENGINE=MyISAM DEFAULTCHARSET=utf8;
|
Самая частая выборка вот такая
SELECT * FROM `prod` d
WHERE d.user_id = 1 AND unixdate BETWEEN 1211227200 AND 1211313599
|
Запросы выполняются не долго но посмотрев EXPLAIN я обратил внимание что он не использует ключ unixdate тоесть затрагиваются теже ряды если не указать интервал даты. Используется только ключ user_id
SELECT * FROM `prod` d
WHERE d.user_id = 1
|
Подскажите в чем может быть проблема, или может как то можно оптимизировать текущий набор индексов? | |
|
|
|
|
|
|
|
для: Ученик
(03.06.2008 в 16:45)
| | Чтобы индекс использовался в первом запросе придётся создать ещё один индекс по двум столбцам, user_id и unixdate. Иначе будет использоваться лишь один из них (кстати, можно явно указать какой ключ следует использовать). | |
|
|
|
|
|
|
|
для: cheops
(04.06.2008 в 01:41)
| | И правда помогло, спасибо!
Только вот я непонял в чем была пробелма раньше, я знал что этот способ должен помочь, но не создавал еще один индекс а добавлял к user_id unixdate. Результат был тот же, сейчас уже думаю может причина была в том что я не сбрасывал ("FLUSH") кеш таблицы между тестами запросов... | |
|
|
|