为了账号安全,请及时绑定邮箱和手机立即绑定

count(release_year = '2006' or NULL)和count(release_year)哪一个更快一些?

select count(release_year = '2006' or NULL) from film;

select count(release_year) from film where release_year = '2006';

连个sql语句哪一个更快一些?

正在回答

3 回答

为什么要加or null?1.因为count(参数) 只要参数不为null,都会进行计数,只写year=2006(相当于year==2006)是个true,计数,如果不加or null,那么year==2007 或者year==2008是个false,也会进行计数。2.如果加了or null 的话 ,year==2006是个ture,true or null 是true 会计数;year==2007是个false,false or null 等于null,则不会计数。可以参考这个文章https://wangyaoxu.github.io/2017/09/21/mysql-count/

0 回复 有任何疑惑可以回复我~
#1

baoziface

走错片场了 T-T
2018-12-27 回复 有任何疑惑可以回复我~

楼上又在扯了.....

这分两种情况讨论:

第一种情况, release_year上没有索引, 这没啥好说的, 都是扫全表.

第二种情况, release_year上有btree索引, 虽然两个查询都会用到索引进行查询, 但是利用的方式是不一样的, [SQL]select count(release_year = '2006' or NULL) from sakila.film;这条语句会进行全索引的遍历, 如果explain这个语句你会发现type是index. 而[SQL]select count(release_year) from sakila.film where release_year = '2006';这条语句会先利用索引找到所有符合where语句条件的记录后执行count, (在数据量非常大的情况下)所遍历的记录会少很多.

楼上之所以测试时间都相等是因为测试表数据太小啦!! 就好像我利用快排排序一个2个元素的数组和利用冒泡排序排序一个2个元素的数组时间几乎是一样的, 因为测试样本根本不具有区分度!

6 回复 有任何疑惑可以回复我~
#1

旺仔小馒头21

你的意思是加where会更好咯?
2020-04-16 回复 有任何疑惑可以回复我~

差不多快。。。。。。呵呵

[SQL]select count(release_year) from sakila.film where release_year = '2006';

受影响的行: 0

时间: 0.001s

[SQL]select count(release_year = '2006' or NULL) from sakila.film;

受影响的行: 0

时间: 0.001s


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

count(release_year = '2006' or NULL)和count(release_year)哪一个更快一些?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信