SQL优化的count和update

本文讲解SQL优化的计数和更新

  • count优化
  • update优化

count优化

引擎处理方式不一样,

MyISAM会将表的总行数存在磁盘,因此执行count()的时候会直接返回这个数,效率较高

innodb在执行count(*)的时候,会将数据一行一行地从引擎读取,然后累计相加。

count()是一个聚合函数,对于返回的结果集,一行一行的的判断,如果count()函数的参数不为null,累计值就加1,否则不加,最后返回累计值。

count(主键)

innoDB引擎会遍历整张表,把每行主键id值取出来,返回服务层。服务层拿到主键按行进行累加。

count(字段)

#统计pro有多少条数据不为null
#没有not null约束,取每行的数据之后,服务层会进行null判断,不为null的一行会累计加1
#有not null约束,取每行的数据之后,服务层直接累计加1
select count(pro) from xxx;

count(1)

#innoDB引擎会遍历整张表,`不会取值`。查询某一个行,放1进去,按行进行累计计数
select count(1) from xxx;

count(*)

#innoDB并不会把全部字段取出来,而是专门做了优化,`不会取值`,服务层直接进行累加

因此执行效率:

count(*)>=count(1)>count(id)>count(字段)

update优化

innoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁。

案例

客户端一开启事务,针对age年龄更新某行数据,客户端二对某行的age年龄更新,当没有为age建立索引时,此时客户端二的操作会被堵塞,这就是行级锁升级为表锁。

当我们为age建立索引之后,更新某行,另一个客户端也对age某行数据更新,是可以成功的,因为客户端一跟新某行只是对表加了行级锁。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容