count(*)
- 一般情况下,三者执行的效率为
COUNT(*)= COUNT(1)> COUNT(字段)
。我们尽量使用COUNT(*)
,当然如果你要统计的是某个字段的非空数据行数,则另当别论,毕竟比较执行效率的前提是结果一样才可以。 - 如果要统计
COUNT(*)
,尽量在数据表上建立二级索引,系统会自动采用key_len
小的二级索引进行扫描,这样当我们使用SELECT COUNT(*)的时候效率就会提升,有时候可以提升几倍甚至更高。
limit 1
如果确定结果集只有一条,那么加上LIMIT 1的时候,当找到一条结果的时候就不会继续扫描了,这样会加快查询速度。这里指的查询优化针对的是会扫描全表的 SQL 语句,如果数据表已经对字段建立了唯一索引,那么可以通过索引进行查询,不会全表扫描的
话,就不需要加上LIMIT 1了。
order by
在 MySQL 中,支持两种排序方式,分别是 FileSort 和 Index 排序。在 Index 排序中,索引可以保证数据的有序性,不需要再进行排序,效率更高。而 FileSort 排序则一般在内存中进行排序,占用 CPU 较多。如果待排结果较大,会产生临时文件 I/O 到磁盘进行排序的
情况,效率较低。
所以使用 ORDER BY 子句时,应该尽量使用 Index 排序,避免使用 FileSort 排序。当然你可以使用 explain 来查看执行计划,看下优化器是否采用索引进行排序。
ORDER BY 就是对记录进行排序。如果你在 ORDER BY 前面用到了 GROUP BY,实际上这是一种分组的聚合方式,已经把一组的数据聚合成为了一条记录,再进行排序的时候,相当于对分的组进行了排序
sql 执行顺序
- FROM 子句组装数据(包括通过 ON 进行连接);
- WHERE 子句进行条件筛选;
- GROUP BY 分组 ;
- 使用聚集函数进行计算;
- HAVING 筛选分组;
- 计算所有的表达式;
- SELECT 的字段;
- ORDER BY 排序;
- LIMIT 筛选。
EXISTS
哪种情况下应该使用 EXISTS,哪种情况应该用 IN。索引是个前提,其实选择与否还是要看表的大小。可以将选择的标准理解为小表驱动大表。
1 SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
2 SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc)
当 A 小于 B 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于:
1 for i in A
2 for j in B
3 if j.cc == i.cc then ...
当 B 小于 A 时用 IN,因为实现的逻辑类似于:
1 for i in B
2 for j in A
3 if j.cc == i.cc then ...