使COUNT(*)查询总数变快

本文介绍了一种通过创建专用表并使用触发器更新记录数量来优化MySQL中大型表的记录计数查询的方法,显著提高了查询效率。
用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 | |
+
---------+------------+------+-----+---------+-------+

3 rows in set (0.02 sec)

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

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

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

1 row in set (0.05 sec)

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

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

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

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

1 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 |
+
----------+

1 row in set (37.79 sec)

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

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

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

1 row in set (0.01 sec)

在执行数据库查询时,若需要对表中的所有记录进行计数操作,可以使用 SQL 的 `COUNT(*)` 函数。该函数会返回表中所有记录的数量,包括 `NULL` 值的行。 以下是一个基本的示例,用于统计表中所有记录的数量: ```sql SELECT COUNT(*) AS total_records FROM table_name; ``` - `COUNT(*)`:统计所有记录的数量。 - `AS total_records`:为结果列提供一个别名,便于阅读和后续使用。 如果需要在特定条件下进行计数,可以结合 `WHERE` 子句实现。例如,统计某一类别下的记录总数: ```sql SELECT COUNT(*) AS total_apples FROM fruits WHERE type = 'apple'; ``` 此查询会统计 `fruits` 表中类型为 `'apple'` 的记录总数[^1]。 此外,如果需要对多个条件分别进行计数,可以使用 `UNION ALL` 结合多个查询。例如,分别统计不同水果类型的数量: ```sql (SELECT COUNT(*) AS apple_count FROM fruits WHERE type = 'apple') UNION ALL (SELECT COUNT(*) AS orange_count FROM fruits WHERE type = 'orange') UNION ALL (SELECT COUNT(*) AS pear_count FROM fruits WHERE type = 'pear'); ``` 通过 `UNION ALL`,可以将多个独立的计数查询结果合并到一起,适用于需要分别统计不同分组的场景。 ### 分组计数 如果需要一次性统计多个分组的记录数量,可以使用 `GROUP BY` 子句。例如,统计每种水果类型的数量: ```sql SELECT type, COUNT(*) AS count FROM fruits GROUP BY type; ``` 此查询会返回每种水果类型的记录数量,适用于需要按类别统计的场景。 ### 注意事项 1. **性能优化**:如果表中存在大量数据,`COUNT(*)` 可能会对性能产生影响。如果只需要统计某列的非空值,可以使用 `COUNT(column_name)` 来替代。 2. **索引优化**:如果经常需要对某一列进行计数操作,建议为该列创建索引,以提高查询效率。 3. **条件过滤**:结合 `WHERE` 子句可以实现更精确的计数,例如统计特定日期范围内的记录数量[^2]。 ### 示例代码 以下是一个完整的示例,展示如何统计表中所有记录的数量,并按条件进行过滤: ```sql -- 统计所有记录 SELECT COUNT(*) AS total_records FROM fruits; -- 统计特定类型的记录 SELECT COUNT(*) AS apple_count FROM fruits WHERE type = 'apple'; -- 按类型分组统计 SELECT type, COUNT(*) AS count FROM fruits GROUP BY type; ``` 通过这些方法,可以灵活地实现数据库中的计数操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值