Java教程

SQL优化

本文主要是介绍SQL优化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

SQL优化

  1. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
  2. in 和 not in 也要慎用,否则会导致全表扫描,如:
 select id from t where num in(1,2,3)    
 
 #对于连续的数值,能用 between:  
   
select id from t where num between 1 and 3    

也可以使用 exits 或 not exits 来代替

  1. 对查询,首先应考虑在 where 及 order by 涉及的列上建立索引,应尽量避免全表扫描。
  2. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  3. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20    

#可以这样查询:    

select id from t where num=10    
union all    
select id from t where num=20    
    
  1. 优化索引失效问题。 链接:索引失效的情况

  2. 用TRUNCATE替代DELETE

  3. 连接比子查询的效率高

  4. 用Where子句替换HAVING子句

 --NO.1  IN的写法  
  SELECT * FROM TABLEA A WHERE 
  A.ID IN 
  ( SELECT ID FORM TABLEB B WHERE B.ID>1)
  --NO.2 exists 写法
  SELECT * FROM TABLEA A WHERE
  EXISTS (
  SELECT 1 FROM TABLEB B WHERE A.ID=B.ID AND B.ID>1) 
  1. 用EXISTS替换DISTINCT
  2. 在java代码中尽量少用连接符“+”连接字符串!
  3. 通常避免在索引列上使用NOT
  4. 用>=替代>两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
  5. 避免在索引列上使用IS NULL和IS NOT NULL
  6. 用UNION-ALL 替换UNION ( 如果有可能的话)
  7. 当只需要一条数据的时候,使用limit 1。这是为了,使EXPLAIN中type列达到const类型
  8. 不使用ORDER BY RAND()
  9. 使用合理的分页方式以提高分页的效率
select id,name from product limit 866613, 20
  1. .应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null    

#可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:    

select id from t where num=0    
这篇关于SQL优化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!