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 необходимо создать промежуточный набор результатов для таких вещей, как сортировка.