gpt4 book ai didi

使用文件排序的 MYSQL 性能变慢

转载 作者:IT老高 更新时间:2023-10-29 00:10:12 25 4
gpt4 key购买 nike

我有一个简单的 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

最佳答案

问题是MySQL在执行查询时只使用一个索引。如果您添加一个使用 WHERE 子句中的 3 个字段的新索引,它将更快地找到行。

ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);

根据 MySQL 文档 ORDER BY Optimization :

In some cases, MySQL cannot use indexes to resolve the ORDER BY, although it still uses indexes to find the rows that match the WHERE clause. These cases include the following:
The key used to fetch the rows is not the same as the one used in the ORDER BY.

这就是您的情况。正如 EXPLAIN 的输出告诉我们的那样,优化器使用关键字 price 来查找行。但是,ORDER BY 位于 date_updated 字段中,它不属于键 price

为了更快地找到行并更快地对行进行排序,您需要添加一个索引,其中包含 WHEREORDER BY 子句中使用的所有字段:

ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);

用于排序的字段必须在索引的最后位置。在索引中包含 price 是没有用的,因为查询中使用的条件将返回一个范围内的值。

如果 EXPLAIN 仍然显示它正在使用文件排序,您可以尝试强制 MySQL 使用您选择的索引:

SELECT adverts.*
FROM adverts
FORCE INDEX(status_approved_date_updated)
WHERE price >= 0
AND adverts.status = 1
AND adverts.approved = 1
ORDER BY date_updated DESC
LIMIT 19990, 10

通常不需要强制索引,因为 MySQL 优化器通常会做出正确的选择。但有时它会做出错误的选择,或者不是最好的选择。您将需要运行一些测试来查看它是否提高了性能。

关于使用文件排序的 MYSQL 性能变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com