查询优化

count(*)

  1. 一般情况下,三者执行的效率为 COUNT(*)= COUNT(1)> COUNT(字段)。我们尽量使用COUNT(*),当然如果你要统计的是某个字段的非空数据行数,则另当别论,毕竟比较执行效率的前提是结果一样才可以。
  2. 如果要统计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 执行顺序

  1. FROM 子句组装数据(包括通过 ON 进行连接);
  2. WHERE 子句进行条件筛选;
  3. GROUP BY 分组 ;
  4. 使用聚集函数进行计算;
  5. HAVING 筛选分组;
  6. 计算所有的表达式;
  7. SELECT 的字段;
  8. ORDER BY 排序;
  9. 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 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值