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-09-27 14:21:43

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

vps上的wordpress系统的mysql的cpu占用很高怎么解决

问题描述 vps上的wordpress系统的mysql的cpu占用很高怎么解决 使用show full processlist;语句,一直显示下面的语句在运行, SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LI

C++系统中指针错误,添加不了对象,真的很急!!!!

问题描述 C++系统中指针错误,添加不了对象,真的很急!!!! 为什么不能实现添加啊!!!!!真的很急 #include <iostream>#include <iomanip>#include <conio.h>#include <string>#include <fstream>#include <cstdlib>using namespace std;int i=0;const int Maxp=100;//最大商品类的数量cl

Mybaits关于if判断 真的很邪门

问题描述 Mybaits关于if判断 真的很邪门 <if test="level != null and level.toString()=='1'"> and t.talent_manager=#{id} </if> 当level!='1' 判断是正确的 当level='1'时,应走判断但是没有走,为什么 解决方案 &(*^&(^&%&$&&*(&*((&%&%& 解决方案二: 今

你的品牌词SEO排名真的很好吗?

常听到一些客户说:我们网站的知名度很高,品牌词总是排在第一名,带来的流量非常大,所以我们品牌词不需要做SEO,更有的客户会说,我们的网站是不需要做SEO.然而,实际上呢? 对于有这样问题的客户,我一般不会直接否定他们的观点,说他们想法错了,即使你说再多的理由也不一定能改变他们,因为他们觉得现在这样很好了.我的做法是:我会让他们搜索其品牌词给我看看,然后我会让他们看看第二名.第三名的网站,以及搜索结果首屏的所有网站,接着让他们心里算一下在这些网站中,有几个是与自己网站/产品相关,对自己网站/产品是

link中能不能不通过实例化对象访问一个成员函数?真的很焦急,谢谢

问题描述 link中能不能不通过实例化对象访问一个成员函数?真的很焦急,谢谢 link中能不能不通过实例化对象访问一个成员函数?真的很焦急,谢谢 解决方案 不可以.因为方法被允许访问成员变量,你都没有实例化怎么访问? 解决方案二: 当然可以访问实例的public方法

苹果 :云计算 真的很可怕

据国外媒体报道,苹果联合创始人史蒂夫-沃兹尼亚克(Steve Wozniak)预测,在未来几年中,云计算服务将会出现"可怕的问题". 在表演者迈克-戴西(Mike Daisey)的独白剧<乔布斯的大悲大喜>(The Agony and the Ecstasy of Steve Jobs)中,61岁的沃兹尼亚克是一个主要角色.在该剧播出后,沃兹尼亚克与戴西和几个观众聊天时,谈到了他在学校担任教师的经历以及在电视剧<与星共舞>(Dancing with the St

对象-这条android java语句真的很复杂,求解析

问题描述 这条android java语句真的很复杂,求解析 tripListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1,int position, long id) {Toast.makeText(ListViewExample2.this,"您选择的是" + list.get(position)

c语言基础-真的很着急,大一学生党,求大神指导写一个c语言拨号程序

问题描述 真的很着急,大一学生党,求大神指导写一个c语言拨号程序 能显示出通讯录中所有人姓名,当选中某个姓名时,屏幕上模拟打字机效果依次显示出此人的电话号码中的各个数字,并伴随相应的拨号声 解决方案 http://zhidao.baidu.com/link?url=svF4fjRTNuBmCJyCiRipzB_21UO5zvNc0hCye7qj8nxOY1lC78667ycDqYnJ7xHiGT00M4NuYqGIak2R5cEU961mjRl1ADLf-Eh1nDKpiBi

php5-wordpress好在哪里?感觉功能很简单,它真的很有技术含量吗?

问题描述 wordpress好在哪里?感觉功能很简单,它真的很有技术含量吗? 我不明白wordpress好在哪,小小的体积感觉工程量不大,功能又太少,为什么这么流行,它很有技术含量吗?为什么没人开发一个比它好的. 解决方案 Wordpress主要是可以迅速开发一个属于你自己的个人网站. 它支持的插件很多,很容易扩展,有全世界的技术人员在开发维护各种新功能. 安装,使用也简单. 你要想自己再做一个,首先推广就不容易,其次,那么多已有功能你怎么吸引开发者转过来移植到你的平台.