本文讲解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某行数据更新,是可以成功的,因为客户端一跟新某行只是对表加了行级锁。