нужно ли использовать двойной индекс?

piton

Новичок
нужно ли использовать двойной индекс?

На сайте используется единая система для рейтинга статей, файлов и т.п., вот структура

PHP:
CREATE TABLE `services_rating` (
  `id` int(11) NOT NULL auto_increment,
  `date` int(11) NOT NULL default '0',
  `service_id` smallint(6) NOT NULL default '0',
  `item_id` int(11) NOT NULL default '0',
  `user_id` int(11) NOT NULL default '0',
  `user_vote` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `service_id` (`service_id`,`item_id`,`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
service_id - тип сущности
item_id - id сущности
user_vote - количество балов

и юзаются такие запросы:

1) SELECT user_vote FROM services_rating WHERE service_id='1' && item_id='777' && user_id='22222'; - чтобы понять голосовал или нет пользователь

вывод explain для верхнего запроса:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables


2) SELECT SUM(user_vote) FROM `services_rating` WHERE `service_id`='1' AND `item_id`='777'; - чтобы вывести итого

UNIQUE юзается, чтобы исключить двойной учет голосов.

Не будет ли лучше сделать индекс по service_id, item_id и user_id и отдельный по service_id, item_id ?

Просто в системе полмиллиона записей и в mysql-slow стали появляться

-~{}~ 01.01.08 22:13:

до кучи, не лучше ли добавить дополнительный индекс по полю service_id, item_id и в запросах N2 юзать USE KEY ?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Навряд-ли тормоза из-за 1-го запроса.
Большая часть посетителей только просмотривают результаты.

Поэтому по моему мнению тормозит исключительно 2-й запрос.
Почему нет по нему explain-а?

Я бы вынес саму сумму в отдельную таблицу vote_sum.

Не будет ли лучше сделать индекс
Об этом должен рассказать explain

-~{}~ 01.01.08 21:39:

Индекс по
?
 

piton

Новичок
вот вывод explain

Код:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	services_rating	ref	service_id,service_id_2	service_id	6	const,const	168
чисто для интереса добавил индекс service_id_2 по service_id, item_id

Код:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	services_rating	ref	service_id_2	service_id_2	6	const,const	232
Extra в обоих случаях пустая, не понял правда почему количество rows отличается хотя запрос один и тот-же, только ключи разные.

-~{}~ 01.01.08 22:55:

с индексом по user_vote
Код:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	services_rating	ALL	NULL	NULL	NULL	NULL	185478	Using where

с использованием отдельного индекса `service_id_2` (`service_id`,`item_id`,`user_vote`)

Код:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 
1	SIMPLE	services_rating	ref	service_id_2	service_id_2	6	const,const	235	Using index
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
только ключи разные.
Ну вот по этому и количество разное.

с индексом по user_vote
откуда взялось?
?
Индекс по user_vote нужен в любом случае, но не только он, а в комплексе с остальными груповыми или не груповыми индексами. Поскольку user_vote Вы используете в SUM(). Запрос будет index. Тоесть для сумированния будет просматриваться весь индекс, user_vote, а не вся таблица (если индекса нет).

Повторюсь "сумму" лучше вынести в другую таблицу.

-~{}~ 01.01.08 22:13:

Одним словом.
http://spivak.kiev.ua/mysql/explain.html
 
Сверху