2010-10-20 4 views
0

Я настраиваю свой запрос для mysql. схема имеет индекс user_id (следующий ..) , но индекс не используется. Зачем?Почему мой mysql не использует индекс?

Env: MySQL4.0.27, MyISAM

SQL является следующее:

SELECT type,SUM(value_a) A, SUM(value_b) B, SUM(value_c) C 
FROM big_record_table 
WHERE user_id='<user_id>' 
GROUP BY type 

Объясните:

|table |type |possible_keys |key |key_len |ref |rows |Extra| 

|big_record_table| ALL| user_id_key|||| 1059756 |Using where; Using temporary; Using filesort| 

вы могли бы описать подробно?

схема следующая:

CREATE TABLE `big_record_table` (
`user_id` int(11) NOT NULL default '0', 
`type` enum('type_a','type_b','type_c') NOT NULL default 'type_a', 
`value_a` bigint(20) NOT NULL default '0', 
`value_b` bigint(20) default NULL, 
`value_c` bigint(20) NOT NULL default '0', 
KEY `user_id_key` (`user_id`) 
) TYPE=MyISAM 
+0

Можете ли вы опубликовать вывод 'SHOW CREATE TABLE big_record_table', пожалуйста? –

+0

Спасибо, что ответили. Я написал SHOW CREATE TABLE big_record_table – freddiefujiwara

+0

Сколько записей было прочитано по этому запросу? – zerkms

ответ

0

Во-первых, мы не видим, как ваши показатели объявлены. Можете ли вы получить свалку таблиц? В PostgreSQL вы должны использовать pg_dump, но я не знаю, как в MySQL. Вы сделали АНАЛИЗ на столе?

+0

спасибо. да, у меня ANALYZEd – freddiefujiwara

+0

Хорошо, но как насчет раскладки таблиц. Я не вижу, как определяются ваши индексы. Вы создали индекс на big_record_table? Как именно был создан этот индекс? –

+0

Я написал схему. не могли бы вы дать мне почему? Должен ли я читать исходный код оптимизатора mysql? – freddiefujiwara

1

Я предполагаю, что type и user_id не являются indexed.

Только a будет работать. Вы не много играете.

+0

Спасибо, что ответили. но я хочу получить Почему только user_id не в порядке? – freddiefujiwara

+0

@ffffff вы группируетесь по типу. Если вы получите огромное количество результатов с помощью 'user_id', все их нужно будет прочитать, чтобы узнать о разных типах. – Frankie

+0

Большое вам спасибо! Если вы знаете документы, перечисленные в. я счастлив – freddiefujiwara

0

Возможно, что неявное преобразование типа предотвращает использование вашего индекса. Вы определили user_id как int, но указали строку в запросе. Это дает MySQL возможность либо преобразовать строку в запросе в int (что может быть неточно), либо преобразовать каждый user_id в базу данных в строку для сравнения с строкой в ​​запросе.

Короткий ответ: попробуйте удалить кавычки в запросе

SELECT type,SUM(value_a) A, SUM(value_b) B, SUM(value_c) C 
FROM big_record_table 
WHERE user_id=123 
GROUP BY type 

(где 123 заменяется с правильным идентификатором пользователя).

Смежные вопросы