简体   繁体   中英

MySQL: Why is this SQL-query not using index?

I have a very simple SELECT that resorts to filesort and does not use index.

Consider the following query:

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

on the following table ( stripped of a few columns to make it more brief here )

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 gives the following output

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

Notice how the explain says there are NULL for possible_keys and how it's using filesort after having scanned ALL rows.

Please advice. Thanks.

This query needs topic_status to appear in the most significant position of an index, because it's searching on a constant.

You have

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

and you may want

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

instead. This may satisfy both the filter and the ORDER BY ... LIMIT part of the query.

Pro tip: Avoid SELECT * and enumerate the columns you actually need instead.

Pro tip: Filesort doesn't necessarily mean what you think it means. It's used anytime MySQL needs to construct an intermediate result set for such things as sorting.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM