查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率。最近在对项目中的一些sql进行优化,总结整理了一些方法。

1、在表中建立索引,优先考虑where、group by使用到的字段。

2、尽量避免使用select *,返回无用的字段会降低查询效率。如下:

SELECT * FROM t

优化方式:使用具体的字段代替*,只返回使用到的字段。

3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE id IN (2,3)

SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)

优化方式:如果是连续数值,可以用between代替。如下:

SELECT * FROM t WHERE id BETWEEN 2 AND 3

如果是子查询,可以用exists代替。如下:

SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)

4、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE id = 1 OR id = 3

优化方式:可以用union代替or。如下:

SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3

(PS:如果or两边的字段是同一个,如例子中这样。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表)

5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE username LIKE '%li%'

优化方式:尽量在字段后面使用模糊查询。如下:

SELECT * FROM t WHERE username LIKE 'li%'

6、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE score IS NULL

优化方式:可以给字段添加默认值0,对0值进行判断。如下:

SELECT * FROM t WHERE score = 0

7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t2 WHERE score/10 = 9

SELECT * FROM t2 WHERE SUBSTR(username,1,2) = 'li'

优化方式:可以将表达式、函数操作移动到等号右侧。如下:

SELECT * FROM t2 WHERE score = 10*9

SELECT * FROM t2 WHERE username LIKE 'li%'

8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE 1=1

优化方式:用代码拼装sql时进行判断,没where加where,有where加and。

最新文章

  1. java给不同步的集合加上同步锁
  2. jquery ajax 返回值 中文时乱码或变成问号解决方法
  3. 第59讲:Scala中隐式转换初体验
  4. 【视频处理】YUV格式说明
  5. CSS中font-size、font-family、line-height顺序以及简写属性
  6. Divide and conquer:Dropping tests(POJ 2976)
  7. CRM 2016 subgrid 的显示隐藏
  8. Maven之问题解决汇总
  9. 多条件判断语句case
  10. 坑爹系列:sizeof运算符
  11. Node.js回调概念
  12. Windows下Oracle不显示中文[已解决]
  13. lua的string库
  14. vuejs 子组件传递父组件的第二种方式
  15. UE4 TSubclassOf VS Native Pointer
  16. WPF 引用 ttf文件
  17. sql_demo
  18. LeetCode 51 N-Queens II
  19. WinFormEx
  20. 第三方jar上传到Maven私服(Nexus)

热门文章

  1. python中ndarray和matrix
  2. Linux(CENTOS7) Nginx负载均衡简单配置
  3. Java - 记录String中intern()方法的学习与理解
  4. R语言入门 (有其他编程语言基础)
  5. php 查看接口运行时间
  6. malloc 底层实现及原理
  7. Akka Typed系列:协议&行为
  8. 记一次修复Windows
  9. Juptyer中的图表显示参数
  10. 吴裕雄--天生自然 JAVA开发学习:重写(Override)与重载(Overload)