mysql-sql优化之-查询总条数
2016-02-29 16:17
375 查看
1、COUNT(*)和COUNT(COL)
COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数。还有有区别的。
优化总结,对于MyISAM表来说:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
2.尽量减少SELECT COUNT(*) FROMtablename WHERE COL = 'value'
这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 ='value'
的出现。
2、COUNT(*)还是COUNT(id)
根据我的理解,应该是使用COUNT(id)更加快速,因为如果我的id是一个自增的主键,那么计算它的数量显然比计算所有字段的数量需要消耗的资源少一些。但是我不止在一篇的类似指导mysql查询加速的文章中看到,都建议我们使用SELECT COUNT(*)而非直接COUNT主键,这是为什么呢?
貌似是因为用MyISAM引擎的表存储了总条数,如果没有WHERE或者WHERE恒为真(比如WHERE 1),那么COUNT(*)可以直接返回总条数。
另外,很显然COUNT(*)不是"计算所有的字段",显然MySQL会把*解析成“一条数据”的意思。
测试数据,简单对比一下,未做更深入的测试:
#0.817-一百万条的查询时间
select count(*) from student ;
#0.789-一百万条的查询时间
select count(id) from student;
#1.011-一百万条的查询时间
select count(name) from student;
#1.162-一百万条的查询时间
SELECT COUNT(*) FROM student WHERE namelike '%xiaoli%';//*默认用主键索引查询,但是加上like条件后索引失效
COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数。还有有区别的。
优化总结,对于MyISAM表来说:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择;
2.尽量减少SELECT COUNT(*) FROMtablename WHERE COL = 'value'
这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 ='value'
的出现。
2、COUNT(*)还是COUNT(id)
根据我的理解,应该是使用COUNT(id)更加快速,因为如果我的id是一个自增的主键,那么计算它的数量显然比计算所有字段的数量需要消耗的资源少一些。但是我不止在一篇的类似指导mysql查询加速的文章中看到,都建议我们使用SELECT COUNT(*)而非直接COUNT主键,这是为什么呢?
貌似是因为用MyISAM引擎的表存储了总条数,如果没有WHERE或者WHERE恒为真(比如WHERE 1),那么COUNT(*)可以直接返回总条数。
另外,很显然COUNT(*)不是"计算所有的字段",显然MySQL会把*解析成“一条数据”的意思。
测试数据,简单对比一下,未做更深入的测试:
#0.817-一百万条的查询时间
select count(*) from student ;
#0.789-一百万条的查询时间
select count(id) from student;
#1.011-一百万条的查询时间
select count(name) from student;
#1.162-一百万条的查询时间
SELECT COUNT(*) FROM student WHERE namelike '%xiaoli%';//*默认用主键索引查询,但是加上like条件后索引失效
相关文章推荐
- MySQL知识(二十二)——数据备份、还原与迁移
- mysql主从同步故障整理
- 在mac下安装mysql时 Access denied for user 'root'@'localhost' (using password: YES) 如何解决
- mysql组内排序
- Jmeter测试Mysql
- mysql5.6主从
- 高效查询mysql表的总记录数
- MySQL分库分表分库后的查询(8th)
- Mysql常用函数
- MySQL分库分表分库准备(6th)
- 【Express系列】第3篇——接入mysql
- MySQL分库分表分表后数据的查询(5th)
- MySQL的主从复制与读写分离技术实例(一)主从复制
- MySQL分库分表单库分表和迁移数据(4th)
- mysql主从复制 配置测试(一主一从)
- MySQL分库分表使用Snowflake全局ID生成器(3rd)
- MySQL分库分表创建新表结构(2nd)
- MySQL分库分表基础表介绍(1st)
- MySQL中/*!40100注释
- MySQL搜索: WHERE 多条件