MySQL的SQL_CALC_FOUND_ROWS真的很慢么?

分页程序一般由两条SQL组成:

SELECT COUNT(*) FROM ... WHERE ....
SELECT ... FROM ... WHERE LIMIT ...

  如果使用SQL_CALC_FOUND_ROWS的话,一条SQL就可以了:

SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE LIMIT ...

  在得到数据后,通过FOUND_ROWS()可以得到不带LIMIT的结果数:

SELECT FOUND_ROWS()

  看上去,似乎SQL_CALC_FOUND_ROWS应该快于COUNT(*),但实际情况并不是这样简单,请看:

  To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS?

  用数据说话,证明了COUNT(*)相对SQL_CALC_FOUND_ROWS来说更快。不过我觉得这个结论也不全面,某些情况下,SQL_CALC_FOUND_ROWS更有优势,看我的实验:

  表结构如下:

CREATE TABLE IF NOT EXISTS `foo` (
`a` int(10) unsigned NOT NULL AUTO_INCREMENT,
`b` int(10) unsigned NOT NULL,
`c` varchar(100) NOT NULL,
PRIMARY KEY (`a`),
KEY `bar` (`b`,`a`)
) ENGINE=MyISAM;

  导入一些测试数据:

for ($i = 0; $i <10000; $i++) {
mysql_query("INSERT INTO foo SET b=ROUND(RAND()*10), c=MD5({$i})");
}

  先测试COUNT(*)方式:

$start = microtime(true);
for ($i = 0; $i < 1000; $i++) {
mysql_query("SELECT SQL_NO_CACHE COUNT(*) FROM foo WHERE b = 1");
mysql_query("SELECT SQL_NO_CACHE a FROM foo WHERE b = 1 LIMIT 100, 10");
}
$end = microtime(true);
echo $end - $start;

  结果输出(数据大小视测试机性能而定):0.75777006149292

  再测试SQL_CALC_FOUND_ROWS方式:

$start = microtime(true);
for ($i = 0; $i < 1000; $i++) {
mysql_query("SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS a FROM foo WHERE b = 1 LIMIT 100, 10");
mysql_query("SELECT FOUND_ROWS()");
}
$end = microtime(true);
echo $end - $start;

  结果输出(数据大小视测试机性能而定):0.6681969165802

  有数据有真相,那为什么我的实验结论和MySQL Performance Blog的结论相悖呢?这是因为在MySQL Performance Blog的实验里,COUNT(*)查询是执行的的Covering Index,而SQL_CALC_FOUND_ROWS是执行的表查询;而在我的实验里,因为我定义了适当的索引,COUNT(*)和SQL_CALC_FOUND_ROWS都是执行的Covering Index,所以结论出现了差异。

  既然使用了Covering Index,就意味着不能再使用SELECT *的形式了,只能使用类似SELECT id这样的形式了,用的列在索引里都能查到,如此说来,我们需要的实际数据从哪来呢?这个很简单,有了主键之后,实际数据可以通过Key/Value形式的缓存获得,这样的架构很常见。

  结论:SQL_CALC_FOUND_ROWS如果执行的是Covering Index的话,是很快的!换个角度看,如果COUNT(*)和SQL_CALC_FOUND_ROWS都只能通过表查询来检索,那么分页时,SQL_CALC_FOUND_ROWS同样会快于COUNT(*),读者可自行测试。

http://kb.cnblogs.com/page/82986/

SQL_CALC_FOUND_ROWS。
SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE LIMIT ...
所谓SQL_CALC_FOUND_ROWS是指在执行带LIMIT的查询时,附带统计一下如果不加LIMIT的话将会输出多少条结果。

在得到数据后,通过FOUND_ROWS()可以得到不带LIMIT的结果数:
SELECT FOUND_ROWS()
时间: 2024-12-22 16:30:46

MySQL的SQL_CALC_FOUND_ROWS真的很慢么?的相关文章

【转】 值得推荐的C/C++框架和库 (真的很强大)

[转] 值得推荐的C/C++框架和库 (真的很强大) 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力.Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行. 下载链接:http://home.tiscali.cz/~cz210552/webbench.html - 2. T

MySQL的SQL_CALC_FOUND_ROWS

分页程序一般由两条SQL组成: SELECT COUNT(*) FROM ... WHERE ....SELECT ... FROM ... WHERE LIMIT ... 如果使用SQL_CALC_FOUND_ROWS的话,一条SQL就可以了: SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE LIMIT ... 在得到数据后,通过FOUND_ROWS()可以得到不带LIMIT的结果数: SELECT FOUND_ROWS() 看上去,似乎SQL_CA

值得推荐的C/C++框架和库 (真的很强大) c

http://m.blog.csdn.net/mfcing/article/details/49001887 值得推荐的C/C++框架和库 (真的很强大) 发表于2015/10/9 21:13:14  14199人阅读 分类: 开源 本篇文章主要介绍了"值得推荐的C/C++框架和库 (真的很强大)",主要涉及到方面的内容,对于C/C++教程感兴趣的同学可以参考一下: 得学习的C语言开源项目- 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使

王金战:改变一个差生真的很简单

当一个学生,反复遭遇失败的打击,他就变成了差生,没有一个学生生下来就注定是个差生.所以让一个差生变好真的很简单.    我刚参加工作的时候,不敢说这句话,但是我现在敢说,因为我多年的经历已经证明了这件事情.让一个差生变好真的很简单,怎么做呢?就是反其道而行之.差生是反复遭遇失败的打击后才产生的,让一个差生变好,就是让他反复享受到成功的喜悦,这个学生就会慢慢地变好了.    少年来我就用这样的方法和理念,帮着一个个学生走出困境,走向成功.我深深体会到,作为教师,作为家长,要学会欣赏孩子.特别是对那

真的很惊喜

其实我只是想在网络上有个记录的地方,能够展示我自己做的东西的一个地方,同时他也是我的动力,但昨天加今天,有两个人加我qq群,准备大家交流想法,也可以一起来做,我真的很高兴,希望以后能够有更多志同道合的人.我今天晚上把我想做的项目做了一个小的整理,也头脑风暴了一下,我想我能够一直坚持下去,尽管我没什么时间,但我想我拿出来一点时间,一定不会后悔的!我真的很喜欢编程.他让我有成就感. 目前这个小项目,主要以学习为主,主体的业务逻辑并不多!

【游戏】鬼泣4真的很华丽啊~~

昨晚又玩了一会儿鬼泣4,打了两关.在最低难度下,真的很惬意,BOSS战也不是很难(昨晚揍的是那个大蛤蟆).可惜一直没抓住击杀要点,最后一下是迷迷糊糊的抓住了蛤蟆的尾巴,把它给干掉了,其间吃了两个小血一个大血,最终的过关评价是“C”,哈哈,我果然对于动作类游戏不在行~~不过我要求不高,能过了就行,欣赏画面是第一位的,吼吼~~值得一说的是,有一个隐藏关,就是要求人不落地,做5次空中抓投.看似很难,其实抓住要点就不难啦.第一次尝试,手忙脚乱,右手不停的在那按按按,结果怪死绝了也没能达到5次空投.第二次

趣写算法系列之--匈牙利算法(真的很好理解)

[书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(-_-

以前很多想法真的很幼稚

这个世界是有那么残酷,我在那种重复的生活中麻木,错觉,自以为是,迷失 告别从前的自己吧,不再为了追求快乐而活着,本来就没有什么的真正的快乐而言,短暂的如烟火,那不是我的 静静的反思人生,很失败么,又能怎么样,还不是要努力的生存着,坚持一件事情生存着,只是为了活着,感觉自己活着而已 那种幼稚的口气与行为活不久的 如果想坚持着那仅剩的让自己好过点得东西,那就告别那个幼稚的自己吧,她早早死去了 以前很多想法真的很幼稚,布布扣,bubuko.com

怎么将pdf转换成word问题真的很简单

你还在寻找将pdf转换成word的方法吗?被网上眼花缭乱的步骤吓到了吗?你不会还在使用office word2003中的Microsoft Office Document Imaging组件来实现pdf转word工作吧.是不是太麻烦了呢?怎么将pdf转换成word问题真的很简单,不需要我们费脑筋,也不需要那么麻烦的操作,这里小编教你一个事半功倍的方法--使用迅捷pdf转换器将pdf转换成word. 经常进行文本格式转换操作的小伙伴们一定知道这款软件吧,不能再简单的操作步骤只需要三步即可完成pdf