【发布时间】:2012-08-22 08:26:57
【问题描述】:
我有一个简单的 mysql 查询,但是当我有很多记录(当前为 103,0000)时,性能真的很慢,它说它正在使用文件排序,我不确定这是否是它很慢的原因。有没有人有任何建议来加快它?还是使用文件排序停止它?
MYSQL 查询:
SELECT *
FROM adverts
WHERE (price >= 0)
AND (status = 1)
AND (approved = 1)
ORDER BY date_updated DESC
LIMIT 19990, 10
解释结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE adverts range price price 4 NULL 103854 Using where; Using filesort
这是广告表和索引:
CREATE TABLE `adverts` (
`advert_id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`type_id` tinyint(1) NOT NULL,
`breed_id` int(10) NOT NULL,
`advert_type` tinyint(1) NOT NULL,
`headline` varchar(50) NOT NULL,
`description` text NOT NULL,
`price` int(4) NOT NULL,
`postcode` varchar(7) NOT NULL,
`town` varchar(60) NOT NULL,
`county` varchar(60) NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
`telephone1` varchar(15) NOT NULL,
`telephone2` varchar(15) NOT NULL,
`email` varchar(80) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT '0',
`approved` tinyint(1) NOT NULL DEFAULT '0',
`date_created` datetime NOT NULL,
`date_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`expiry_date` datetime NOT NULL,
PRIMARY KEY (`advert_id`),
KEY `price` (`price`),
KEY `user` (`user_id`),
KEY `type_breed` (`type_id`,`breed_id`),
KEY `headline_keywords` (`headline`),
KEY `date_updated` (`date_updated`),
KEY `type_status_approved` (`advert_type`,`status`,`approved`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
【问题讨论】:
-
如果省略
LIMIT 19990,10子句,会不会也很慢?如果您将其切换为LIMIT 10,您可能会获得更快的操作。在这种情况下,您可能想弄清楚如何使用SELECT而不是LIMIT来检索这些行。 -
我只添加了索引
status_approved(status,approved,date_updated)。解释现在说它使用 where 而不是 filesort 并且查询需要 0.04 秒而不是 2 秒 + 就像以前一样,我认为这可能已经解决了。 -
只是一个无关的想法......这些括号都不是必需的。
标签: mysql performance database-performance filesort