使COUNT(*)查询总数变快

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
用COUNT来查询一个表的记录多少,小的时候无所谓,记录多的时候速度就是个问题。
那天在PGSQL版里看到这个。总结一下。
此刻表引擎为MyISAM.
mysql> desc content;
+
---------+------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |
+
---------+------------+------+-----+---------+-------+

| cid | int(11) | NO | | 0 | |
| aid | int(11) | YES | | NULL | |
| content | mediumtext | YES | | NULL | |
+
---------+------------+------+-----+---------+-------+

rows in set (0.02 sec)

mysql> select count(*) from content;
+
----------+

| count(*) |
+
----------+

| 208081 |
+
----------+

row in set (0.05 sec)

更新为INNODB.
mysql> alter table content engine innodb;
Query OK, 208081 rows affected (min 19.80 sec)
Records: 208081 Duplicates: 0 Warnings: 0

mysql> select count(*) from content;
+
----------+

| count(*) |
+
----------+

| 208081 |
+
----------+

row in set (33.99 sec)

新建立一个表专门存储记录的多少。如果要存放多个表的记录数目,以后增加相应的字段就可以了。
create table t_count (count_content int not null default 0);
insert into t_count(count_content) select count(*) from content;

DELIMITER $$
CREATE TRIGGER `tr_count_insert` AFTER INSERT on `content`
FOR EACH ROW BEGIN
  update t_count set count_content = count_content + 1;
END$$

DELIMITER ;

DELIMITER $$

CREATE TRIGGER `tr_count_delete` AFTER DELETE on `content`
FOR EACH ROW BEGIN
  update t_count set count_content = count_content - 1;
END$$
DELIMITER ;
这样虽然对数据更新操作有性能上的影响,不过查询速度就非常快了。因为这个表无论如何只有一条记录。
mysql> delete from content limit 1;
Query OK, 1 row affected (0.06 sec)

mysql> select count(*) from content;
+
----------+

| count(*) |
+
----------+

| 208080 |
+
----------+

row in set (37.79 sec)

mysql> select count_content from t_count;
+
---------------+

| count_content |
+
---------------+

| 208080 |
+
---------------+

row in set (0.01 sec)





本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/81266,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
对象存储
统计数组中的重复数据的数量
这篇文章总结了5种统计数组中重复数据数量的方法。方法1和4使用for循环和对象存储计数;方法2和5利用`reduce`函数,其中方法5是最简写形式;方法3是特定场景下的应用,针对特定值计数。所有方法最终都返回一个对象,键为数组元素,值为出现次数。
|
算法 前端开发
统计圆内格点数目
🎈每天进行一道算法题目练习,今天的题目是“统计圆内格点数目”。
162 0
【TP5.1】查询在数组内的所有数据,并且根据用户id分组,计算消费金额总和大于100的数量
【TP5.1】查询在数组内的所有数据,并且根据用户id分组,计算消费金额总和大于100的数量
165 0
【TP5.1】查询在数组内的所有数据,并且根据用户id分组,计算消费金额总和大于100的数量
|
算法 前端开发
【前端算法】独一无二的出现次数,统计次数加去重
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
86 0
|
SQL 移动开发 Oracle
不同的SQL平台,如何取前百分之N的记录?
最近帮业务部门梳理业务报表,其中有个需求是就算某指标等待时间最长的前百分之十,其实就是对等待时长进行倒序排序后,取结果集的前百分之十。 这个需求在SQL Server和Oracle上都很容易实现,甚至是在MySQL 8.0也很容易实现,只是恰好我们业务数据库是MySQL 5.7 先给大家介绍下不同数据库平台的实现方法。
不同的SQL平台,如何取前百分之N的记录?
|
SQL 程序员 数据库
SQL 查找是否"存在",别再 COUNT 了,很耗费时间的
根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT COUNT(*) 呢? 无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的COUNT
使用正则表达式统计VS2017项目的代码量(统计源码总行数)
使用正则表达式统计VS2017项目的代码量(统计源码总行数)
332 0
使用正则表达式统计VS2017项目的代码量(统计源码总行数)
|
SQL 算法 Java
SQL 查找"存在",别再用 count 了,很耗费时间的!
根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT count(*) 呢?
11034 0
SQL 查找"存在",别再用 count 了,很耗费时间的!
|
开发工具 开发者 git
git统计某一名开发者有效代码总行数以及历史删除、增加的总行数
git统计某一名开发者有效代码总行数以及历史删除、增加的总行数 git命令: git log --author="zhangphil" --pretty=tformat: --numstat | gawk '{ add...
3506 0