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(*):

文章插图
图片
count(name):

文章插图
图片
count(1):

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

文章插图
图片
会话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';
文章插图
图片
由于name没有索引,所以会把整张表都锁?。?贾禄峄?等待会话1提交事务 。
解决方法:给name字段添加索引
记住一点,根据索引字段去更新数据即可?。ㄒ蛭?饕?侄蜗嗟庇谏系男兴?,非索引字段上的表锁) 。
推荐阅读
- 准线上事故之MySQL优化器索引选错
- Rust中的数据可视化指南
- 什么是网络中的路由器?核心功能解释
- Elasticsearch 性能优化详解
- SEO快速排名的方法!? seo快速排名案例
- 介绍一下目前最先进的电动汽车
- 时尚活动生图:白鹿丰满有料,被莫文蔚的脸吓到,倪妮穿的啥
- 为什么54岁的许晴不婚不育?她终于承认: 如果他还在,我会嫁!
- 真正聪明的男人,都懂得用这4个“套路”,让女人粘到离不开你!
- 长期缺爱的女人,身上会有3种习惯,很好追
