MySQL: почему этот SQL-запрос не использует индекс?

У меня есть очень простой SELECT, который прибегает к сортировке файлов и не использует индекс.

Рассмотрим следующий запрос:

SELECT * FROM forum_topic
WHERE topic_status = 0
ORDER BY modified_date LIMIT 0, 30

в следующей таблице (без нескольких столбцов, чтобы сделать его более кратким здесь)

CREATE TABLE `forum_topic` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`slug` varchar(255) NOT NULL,
`forum_id` int(10) NOT NULL DEFAULT '1',
`title` varchar(100) NOT NULL,
`topic_status` tinyint(1) NOT NULL DEFAULT '0',
`post_count` bigint(20) NOT NULL DEFAULT '0',
`modified_date` datetime NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `slug` (`slug`),
  FULLTEXT KEY `title` (`title`),
  KEY `modified` (`modified_date`, `topic_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

EXPLAIN дает следующий вывод

id  select_type table?      partitions? type?   possible_keys?  key?    key_len?    ref?    rows?   Extra?
1   SIMPLE      forum_topic NULL        ALL     NULL            NULL    NULL    NULL    2075    Using where; Using filesort

Обратите внимание, как объяснение говорит, что для возможных_ключей есть NULL, и как оно использует файловую сортировку после сканирования ВСЕХ строк.

Пожалуйста посоветуй. Благодарю.

1 ответ

Этот запрос нуждается topic_status появляться в наиболее значимой позиции индекса, потому что он ищет по константе.

У тебя есть

   KEY `modified` (`modified_date`, `topic_status`)

и вы можете захотеть

   KEY `mod2` (`topic_status`, `modified_date` )

вместо. Это может удовлетворить как фильтр, так и ORDER BY ... LIMIT часть запроса.

Совет: избегайте SELECT * и перечислите столбцы, которые вам действительно нужны.

Совет от профессионала: сортировка файлов не обязательно означает, что вы думаете. Он используется в любое время, когда MySQL необходимо создать промежуточный набор результатов для таких вещей, как сортировка.

Другие вопросы по тегам