【转】MySQL count(*)速度慢优化
select count(*)是MySQL中用于统计记录行数最常用的方法。
count
方法可以返回表内精确的行数,每执行一次都会进行一次全表扫描,
以避免由于其他连接进行delete
和insert
引起结果不精确。
在某些索引下是好事,但是如果表中有主键,count(*)
的速度就会很慢,特别在千万记录以上的大表。
如果用 explain
命令速度会快很多,因为 explain
用并不真正执行查询,而是查询优化器【估算】的行数。
在一个1500万
条记录的表中测试,用select count(*)
耗时15s
,而用explain
耗时0.08
秒,
两者相差差不多有200倍之多(第一次执行会稍慢,3秒左右)。
如下是explain
方式:
mysql> explain select * from posts;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------+
| 1 | SIMPLE | posts | NULL | ALL | NULL | NULL | NULL | NULL | 12596096 | 100.00 | NULL |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------+ 1 row in set, 1 warning (0.08 sec)
注意,这里用的是select *,不是select count(*)。
select *
会返回一行数据,包括估算行数rows,在PHP中我们fetch()
,再通过$result['rows']
就可以拿到这个预估值。
select count(*)
则会在extra中有一行Select tables optimized away
,不会拿到函数估算值。
所以,在对数据准确性要求不高,但是对速度要求很苛刻的场合,绝对有必要用这个估算值代替。
你也可以用下面这句,结果和explain
一模一样:
select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='posts';
+------------+
| TABLE_ROWS |
+------------+
| 12596096 |
+------------+
1 row in set (0.04 sec)
根据实际情况任选一个,都是同一个东西。
参考资料:
【转】MySQL count(*)速度慢优化的更多相关文章
- 百万数据 mysql count(*)优化
一.故事背景有一张 500w 左右的表做 select count(*) 速度特别慢. 二.原 SQL 分析Server version: 5.7.24-log MySQL Community Ser ...
- 【mysql】mysql统计查询count的效率优化问题
mysql统计查询count的效率优化问题 涉及到一个问题 就是 mysql的二级索引的问题,聚簇索引和非聚簇索引 引申地址:https://www.cnblogs.com/sxdcgaq8080/p ...
- [MySQL Reference Manual] 8 优化
8.优化 8.优化 8.1 优化概述 8.2 优化SQL语句 8.2.1 优化SELECT语句 8.2.1.1 SELECT语句的速度 8.2.1.2 WHERE子句优化 8.2.1.3 Range优 ...
- 101个MySQL 的调节和优化的提示
MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...
- 101个MySQL的调节和优化的Tips
MySQL 是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些 ...
- MySQL 数据库 Query 的优化
理解MySQL的Query Optimizer MySQL Optimizer是一个专门负责优化SELECT 语句的优化器模块,它主要的功能就是通过计算分析系统中收集的各种统计信息,为客户端请求的Qu ...
- 100个MySQL 的调节和优化的提示
100个MySQL 的调节和优化的提示 MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧. ...
- 101 个 MySQL 的调节和优化的提示
英文原文:101 Tips to MySQL Tuning and Optimization MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它 ...
- MYSQL常见的可优化点
MYSQL常见的可优化点 SQL常见的可优化点 2014年6月8日 DBA 发表回复 # #################################################### 索引 ...
随机推荐
- jsp页面中的EL表达式不被解析的问题
原因:问题在web.xml配置文件上,web.xml声明部分一般分为如下版本的xsd, web-app_2_2.xsd web-app_2_3.xsd web-app_2_4.xsd web-app_ ...
- asp.net mvc中的用户登录验证过滤器
在WEB项目中建立 类: public class LoginFilter : ActionFilterAttribute { public override voi ...
- VS2017中建立ASP.NET MVC 4.0项目
新的项目需要运行在WIN2003上,又不想用ASPX了,只好用回ASP.NET MVC4.0了,可是在VS2017中已经没有MVC4的模板了,网上下载的安装了也没有,只好把以前的MVC4的项目拿 出来 ...
- mongodb导出数据表命令之mongoexport
mongoexport导出文件格式支持csv和json,不同的是csv格式必须显示的指定要导出的字段,如: mongoexport -d rbac -c rbacs -o d:/web/rbac.cs ...
- 用casperjs模拟登录,支持多个账户登录
var casper = require('casper').create({ viewportSize:{ width:1920, height:1080 } }); var url1 = 'htt ...
- 关于casperjs的wait方法的执行顺序
var casper = require('casper').create({ viewportSize:{ width:1920, height:1080 } }); var url1 = 'htt ...
- 每日英语:China's Bigger Innovation Problem
Last month's Third Plenum meeting of Chinese leaders seemed to signal Beijing's intention to experim ...
- python(46):对字典进行排序,多键值排序
注:改于2017-12-07,python3 下 Removed dict.iteritems(), dict.iterkeys(), and dict.itervalues(). Instead: ...
- android使用POI读写word doc文件
目录 1 读word doc文件 1.1 通过WordExtractor读文件 1.2 通过HWPFDocument读文件 2 写word doc文件 Apache p ...
- 【驱动】MTD子系统分析
MTD介绍 MTD,Memory Technology Device即内存技术设备 字符设备和块设备的区别在于前者只能被顺序读写,后者可以随机访问:同时,两者读写数据的基本单元不同. 字符设备,以字节 ...