count查询优化

count查询优化

这里的所说的count查询优化是针对MyISAM引擎进行的。

例子1:假设有t_ve_school表,共有61868行数据
INNODB 引擎
explain select count(*) from t_ve_school where id>5;
这里写图片描述

explain select count(*) from t_ve_school ;
这里写图片描述

explain select (select count() from t_ve_school) - count() from t_ve_school where id <=5;
这里写图片描述
MyISAM 引擎
explain select count(*) from t_ve_school where id>5;
这里写图片描述

explain select count(*) from t_ve_school ;
这里写图片描述

explain select (select count() from t_ve_school) - count() from t_ve_school where id <=5;
这里写图片描述

从上面的展示可以看出来MyISAM 引擎的影响行数为null,所以要是MyISAM引擎的话可以利用这个特性进行count的优化

例子2:可以利用count不统计null 的性质,如果想查找属于天津市的学校和属于北京市的学校个数分别是多少,可以通过如下方式:
select count(city_id=1 or null) as 北京市学校数量 , count(city_id=2 or null) as 天津市学校数量 from t_ve_school;
这里写图片描述

案例

Mysql的队列表,一些高流量、高并发的系统,典型的模式是一个表包含多种类型的记录:未处理、正在处理、已处理的记录等。一个或者多个消费者线程在表中查找未处理的记录,然后声称正在处理,当处理完成后再将记录更新成已处理状态。一般的,例如邮件发送、多命令处理、评论修改等。但这里也会存在两个问题,一、随着队列表越来越大和索引深度的增加,找到未处理记录的速度会随之变慢。这个问你题可以通过将队列表分为两部分来解决这个问题,就是将已处理的记录归档或者存放到历史表,这可以始终保证队列表很小。二、先找到未处理记录然后加锁。找到记录会增加服务器的压力,而加锁操作则会让各个消费者进程增加竞争,因为这是一个串行化的操作。这里找到未处理记录一般来说没有问题,如果有问题则可以通过使用消息的方式通知各个消费者。最后需要解决的问题是如何让消费者标记正在处理的记录,而不至于让多个消费者重复处理一个记录。这里我们可以使用update来更新记录,然后检查是否还有其他的记录需要处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值