SQL优化的七个方法,你会哪个?( 三 )


 
explain select *from student_info where id > 2000000 limit 10 
六、COUNT优化count是一个聚合函数,用于求取符合条件的总数据量 。
MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高 。
InnoDB引擎就比较麻烦,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累计计数 。
count的几种用法:
count()是一个聚合函数,对于返回的结果集,一行行地判断 , 如果count函数的参数不是NULL,累计值就加1,否则不加,最后返回累计值 。
用法:count(*)、count(主键)、count(字段)、count(1)、count(0).
count(主键):InnoDB会遍历整张表,把每一行的主键id值都取出来,返回给服务层 。服务层拿到主键后,直接按行进行累加(主键不可能为null) 。
count(字段):没有not null约束的话 , InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加;有not null约束的话,InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加 。
count(1):InnoDB引擎遍历整张表,但不取值 。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加 。
count(*):InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加 。
按照效率排序:count(字段)<count(主键)<count(1)<count(*)
count(*):

SQL优化的七个方法,你会哪个?

文章插图
图片
count(name):
SQL优化的七个方法,你会哪个?

文章插图
图片
count(1):
SQL优化的七个方法,你会哪个?

文章插图
图片
七、UPDATE优化InnoDB 的行锁是针对索引加的锁,不是针对记录加的锁 , 并且该索引不能失效,否则会从行锁升级为表锁 。
测试1:
开启两个会话:更新student表的数据 , 会话1更新id为2的数据,会话2更新id为2的数据
SQL优化的七个方法,你会哪个?

文章插图
图片
会话1:
update student set name = '123' where id = 1;由于id有主键索引,所以只会锁id = 1这一行;
会话2: id=2,当然会立马执行结束,不用等待会话1提交事务
update student set name = '123' where id = 2;测试2:
开启两个会话:更新student表的数据,会话1更新name(name字段无索引)为2的数据,会话2更新id为2的数据
update student set name = '123' where name = 'test';
SQL优化的七个方法,你会哪个?

文章插图
图片
由于name没有索引,所以会把整张表都锁?。?贾禄峄?等待会话1提交事务 。
解决方法:给name字段添加索引
记住一点,根据索引字段去更新数据即可?。ㄒ蛭?饕?侄蜗嗟庇谏系男兴?,非索引字段上的表锁) 。



推荐阅读