Почему мой MySQL не использует индекс? - PullRequest
0 голосов
/ 20 октября 2010

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

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

Ответы [ 3 ]

1 голос
/ 20 октября 2010

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

Просто будет работать.Ты не даешь много играть.

0 голосов
/ 20 октября 2010

Возможно, неявное преобразование типов не позволяет использовать ваш индекс. Вы определили user_id как int, но указали строку в запросе. Это дает MySQL возможность либо преобразования строки в запросе в целое число (что может быть неточным), либо преобразования каждого 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 заменяется на правильный идентификатор пользователя).

0 голосов
/ 20 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...