Вопрос по mysql – Мой простой запрос MySql не использует индекс

8

У меня очень простой запрос:

<code>  SELECT   comments.*
  FROM comments 
  WHERE comments.imageid=46
</code>

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

<code>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 ;
</code>

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

<code>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
</code>

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

<code>  SELECT   comments.id
  FROM comments 
  WHERE comments.imageid=46
</code>

вот объяснение:

<code>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
</code>
Это не"But MySql can't use index", Это: & quot; Но MySqlwon't использовать индекс & quot ;.possible_keys = ids а такжеkey = NULL Предполагают, что использование индекса было проверено оптимизатором и отклонено. Полное сканирование таблицы, как думали, было быстрее - и это, вероятно, в вашем случае. ypercubeᵀᴹ

Ваш Ответ

3   ответа
1

может быть считана из индекса (поскольку первичный ключ является частью любого вторичного индекса в InnoDB).

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

7

что у вас есть несколько строк в комментариях. table, именно поэтому MySQL выполняет полное сканирование таблицы вместо использования индекса в первом запросе. Предполагается, что стоимость полного сканирования таблицы может быть ниже, чем сначала соответствовать индексу, а затем искать строки.

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

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

Error: User Rate Limit Exceeded MscEliot
1

Похожие вопросы