问答详情
源自:2-7 Count()和Max()的优化

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语句哪一个更快一些?

提问者:海角孤星 2014-11-17 22:27

个回答

  • baoziface
    2018-12-27 00:12:31

    为什么要加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/

  • 逐日_不悔
    2015-07-29 11:42:24

    楼上又在扯了.....

    这分两种情况讨论:

    第一种情况, 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个元素的数组时间几乎是一样的, 因为测试样本根本不具有区分度!

  • diyang笛扬
    2014-12-11 22:05:03

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

    [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