SQL中直接执行 COUNT() 和 SELECT 出来再统计哪个性能好
2018-01-22| 程成| 1659| 0| MySQL

写 SQL 时,我一直认为直接执行 select count(id) 的性能不好,没有先 select 所有的条数,再通过 count(条数) 的性能优秀,但是最近的一次遭遇改变了我这个错误的想法。


首先是一张30万数据的表,我通过先 select 所有再 count(条数) 的方法执行


image.png


然后执行就报错内存溢出的错误了(如何解决内存溢出可以看这里【点击】)


image.png


但是我用执行 select count(id) 的方法


image.png


得到下面结果(执行时间1174ms):


image.png


可见,select count(id) 比 先一起 select 出来再统计数量的 SQL 开销小太多太多了,错误的观念要通过实践验证。底层的原因不太清楚,有了解的欢迎给我留言,不胜感激。


这里介绍下 count(id) 和 count(1) 和 count(*) 三者的区别:


一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的,假如表没有主键(Primary key), 那么count(1)比count(*)快,如果有主键的话,那主键作为count的条件时候count(主键)最快;如果你的表只有一个字段的话那count(*)就是最快的count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计


selelct 常量 from ... 对应所有行,返回的永远只有一个值,即常量。所以正常只会用来判断是否有还是没有(比如exists子句)。而select * from ... 是返回所有行的所有列。


性能上的差异,关键看你的from和where子句。比如说如果你的where条件中可以通过索引,那显然 select 1 from ... 的性能比 select * from ... 好。




×
作者:程成
QQ:492245711