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来更新记录,然后检查是否还有其他的记录需要处理。