2012-04-15 3 views
7

У меня есть очень простой запрос:Мой простой MySql запрос не использует индексировать

SELECT comments.* 
    FROM comments 
    WHERE comments.imageid=46 

И это мой стол:

CREATE TABLE IF NOT EXISTS `comments` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `imageid` int(10) unsigned NOT NULL DEFAULT '0', 
    `uid` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `content` text CHARACTER SET utf8, 
    `adate` datetime DEFAULT NULL, 
    `ip` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `ids` (`imageid`) USING BTREE, 
    KEY `dt` (`adate`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

Но MySql не может использовать индекс на этом простом запросе , вот результат объяснения:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ALL  ids  NULL NULL NULL 4 75.00 Using where 

Пока я меняю запрос на это, Mysql может использовать индекс. Зачем? :

SELECT comments.id 
    FROM comments 
    WHERE comments.imageid=46 

вот объясняю:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ref  ids  ids  4 const 4 100.00 Using index 
+0

Это не * «Но MySql ** не может использовать индекс» *. Это: «Но MySql ** не будет использовать индекс». «Возможные_keys = ids» и «key = NULL» предполагают, что использование индекса было проверено оптимизатором и отклонено. Считалось, что сканирование полного стола было быстрее - и, вероятно, это в вашем случае. –

ответ

6

Я предполагаю, что у вас есть несколько строк в таблице «Комментарии», поэтому MySQL делает полный сканирование таблицы вместо использования индекса в вашем первом запросе. Он оценивает, что стоимость полного сканирования таблицы может быть ниже, чем первая совпадение индекса, а затем поиск строк.

В вашем втором запросе используется индекс, потому что можно получить все столбцы запроса (столбец «id») непосредственно из индекса без необходимости искать строки таблицы после сопоставления индекса. Это значение дополнительной информации «Использование индекса».

Попробуйте, если со значительным количеством строк в комментариях MySQL все еще использует полное сканирование, я думаю, что это будет странное поведение. Фактически, я тестировал точно то же самое в версии MySQL версии 5.1, и он всегда использует «индекс» даже с несколькими строками.

+0

Спасибо, человек, ты прав! ;) – MscEliot

1

Второй запрос - это запрос, охватывающий индекс. Вся запрошенная информация может быть прочитана из индекса (поскольку первичный ключ является частью любого вторичного индекса в InnoDB).

В первом запросе MySQL должен прочитать PK из индекса, а затем прочитать строки. Поскольку таблица имеет такое небольшое количество строк, оптимизатор решает, что она будет быстрее, если она будет читать строки напрямую и отбросить те, которые не соответствуют

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