Mysql 限制行计数之间的Sql查询性能差异

Mysql 限制行计数之间的Sql查询性能差异,mysql,sql,database,performance,Mysql,Sql,Database,Performance,我有一张有17万张唱片的拥抱桌 这两个查询之间有什么区别 Showing rows 0 - 299 (1,422 total, Query took 1.9008 sec) SELECT 1 FROM `p_apartmentbuy` p where p.price between 500000000 and 900000000 and p.yard = 1 and p.dateadd between 1290000000 and 1320000000

我有一张有17万张唱片的拥抱桌

这两个查询之间有什么区别

Showing rows 0 - 299 (1,422 total, Query took 1.9008 sec)
    SELECT 1 FROM `p_apartmentbuy` p 
    where 
    p.price between 500000000 and 900000000
    and p.yard = 1
    and p.dateadd between 1290000000 and 1320000000
    ORDER BY `p`.`id` desc
    limit 1669
说明

还有这个:

Showing rows 0 - 299 (1,422 total, Query took 0.2625 sec)
    SELECT 1 FROM `p_apartmentbuy` p 
    where 
    p.price between 500000000 and 900000000
    and p.yard = 1
    and p.dateadd between 1290000000 and 1320000000
    ORDER BY `p`.`id` desc
    limit 1670
说明:


这两个查询都使用1个具有相同数据和相同where clasue的表,但只有限制行数不同

MySQL有一个用于排序的缓冲区。当要排序的内容太大时,它会对块进行排序,然后对它们进行合并排序。这称为“文件排序”。您的第1670行显然刚刚溢出排序缓冲区

阅读更多细节


现在为什么它为内存排序选择另一个键。。。我不太确定;但显然,它的策略不是很好,因为它最终会变慢。

回顾:奇怪的是,返回更多行的查询运行得更快

这与缓冲区与文件排序无关,对1400条记录进行排序需要不到1秒的时间

第一个解释显示查询优化器进行线性扫描,第二个解释显示它使用索引。即使是部分有用的索引通常也比没有要好得多

在内部,mysql维护关于索引大小的统计信息,并尝试猜测哪个索引,或者线性扫描是否会更快。这个估计是特定于数据的,我已经看到mysql在100次中使用了99次正确的索引,但是偶尔会选择一个不同的索引,并以50倍的速度运行查询


您可以使用SELECT。。。从…起强制索引(…)

MySQL中也有页面缓存吗?这在SQL Server中很常见,因为数据位于memory.tnx中,所以第二次运行速度更快。如何禁用此缓冲区进行排序?您可以设置
@@sort\u buffer\u size
,但这是一个错误。要尝试的一件事是
选择。。。使用索引(码)
,以确保使用更快的策略;看看
解释
是怎么说的。@Amadan:我测试了第一个查询(2sec)选择。。。使用索引(码)。。。限制1669。但这次查询只花了0.2秒对不起,看来我还是帮不了你…:(