首页 > 数据库 >SQL优化的几种方法

SQL优化的几种方法

时间:2023-02-10 15:02:22浏览次数:29  
标签:join 记录 子句 优化 SQL 几种 索引 使用 where

1、对查询进行优化,应尽量避免全表扫描,首先考虑在where及order by上建立索引。

2、应尽量避免在where子句中进行以下操作:对字段进行null判断;使用!=或<>操作符;使用or连接条件;使用in或not in;使用like;等号左侧使用算术运算;对字段进行函数运算等。以上操作将导致引擎放弃索引而进行全表扫描。

3、不要写一些没有意义的查询,如生成一个空表。

4、使用exists替代in,用not exists替代not in。not in 是低效的,因为它对子查询中的表执行了一个全表遍历,他执行了一个内部的排序和合并。select num from a where exists(select 1 from b where num=a.num)

5、对只含数值信息的字段尽量使用数值型代替字符型,否则会降低查询和连接性能。

6、尽可能使用varchar代替char,节约存储空间,提高效率。

7、尽量用具体字段代替*进行查询。

8、在使用索引字段作为条件时,如果索引是复合索引,必须使用该索引的第一个字段作为条件才能保证系统使用该索引。

9、当索引中有大量重复数据时,索引是无效的。

10、当进行update或insert操作时,索引的存在会降低该操作的效率。

11、尽量避免频繁创建或删除临时表,减少系统资源消耗。

12、在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免产生大量log,提高效率。

13、如果使用到了临时表,在存储过程的最后务必将所有的临时表显示的删除,先truncate table ,然后drop table,避免系统表长时间锁定。

14、尽量避免使用游标,因为游标效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

15、对于小型数据集使用fast_forward游标要优于其他逐行处理方法,尤其是在必须引用几个表才能获取所需要的数据时。

16、表名顺序。选择最有效率的表名顺序,from后面先跟大表,再跟小表,因为from子句中写在最后的表被优先处理,from后跟多个表的情况下,应该选择记录条数最少的表作为优先处理的表;

17、where子句连接顺序。那些可以过滤最大数量记录的条件必须写在where子句的末尾;

18、高效删除重复记录。最高效的删除重复记录方法 ( 因为使用了ROWID)例子:delete from emp a where a.rowid>(select min(b.rowid) from emp b where a.emp_no=b.emp_no);

19、使用truncate替代delete。当用delete删除表中记录时,回滚段rollback用来被存放可以被恢复的信息,如果你不执行commit,oracle会将数据恢复到删除之前的状态;当运行truncate时,回滚段不再存放任何可被恢复的信息,当运行truncate时,数据不再被恢复,此时很少的资源被调用,执行时间也会很短;

20、尽量多使用commit。随着commit的多次使用,系统资源被释放,性能会提高;

21、用where子句替换having子句。having只会在检索出所有记录之后才对结果集进行过滤。on、where、having这三个都是删选条件的子句,on最先执行,where次之,hiving最后;on先把不符合条件的记录过滤才进行统计,它可以减少中间运算要处理的数据,on的使用仅限于多表连接;where也是过滤数据后才进行sum;hiving是在计算之后才启作用;

22、使用表的别名。当sql语句中连接多个表时,请使用表的别名并用别名前缀识别每个column,这样可以减少sql解析时间,避免歧义;

23、用>=替代>

高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3

前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。

24、用union all替换union。当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。如果用UNION ALL替代UNION,这样排序就不是必要了。效率就会因此得到提高。

25、当使用join(inner join或left join)操作时,就应该是小表在前,大表在后。把重复关联键少的表放在join前面做关联可以提高join的效率。

标签:join,记录,子句,优化,SQL,几种,索引,使用,where
From: https://www.cnblogs.com/superfeeling/p/17108919.html

相关文章

  • Code::Blocks 2023.01 全中文汉化-优化版
    Code::Blocks是一款开放源码、功能全面的跨平台集成开发环境(IDE),通过集成相应的编译器,可以支持使用广泛的C和C++程序开发。而且通过集成各种插件,可以实现各种扩展功能。......
  • MySQL视图、存储过程、函数、触发器、定时任务、流程控制总结
    视图的增删改查视图相当于一张只能读的表,不可以修改。当组成视图的表发生数据变化的时候,视图会相对应的进行改变。存储过程的练习创建存储过程:create[ifnotexi......
  • Microsoft.Data.SqlClient.SqlException (provider: SSL Provider, error: 0 - 证书
    异常内容描述Microsoft.Data.SqlClient.SqlExceptionHResult=0x80131904Message=Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerrorocc......
  • react18 startTransition过度任务 性能优化
     官方:React.startTransition 不提供 isPending 的标志。要跟踪过渡的待定状态,请参阅 React.useTransition。由于React.startTransition 不支持跟踪pending状态,则......
  • sqlite数据库死亡提示database disk image is malformed的修复经历
    今天在处理一个客户的问题时,发现使用客户的sqlite数据库,本地调试代码报databasediskimageismalformed,查了下说是文件损坏了,网上有修复的方法,说实话开始也不抱太大......
  • MySQLInstallerConsole.exe程序弹出窗口提示“MySQL Installer is running in Communi
    电脑运行中时不时弹出一个窗口,没反应过来就一下自动关闭了,下次再弹出,怎么回事?原来是MySQL的定时更新任务。 解决办法:这个是新版本MySQL服务自带的一个定时任务,每天......
  • 测开-面试题-MySQL
    1 增删改查的关键字分别是什么? 2 内连接和外连接的区别? 3 MySQL里面锁是怎么使用的? 4 Mysql隔离级别? 5MVCC机制实现原理? 6 通过mysql做过哪些工作? ......
  • mysql最佳实践
    MySQL是一个流行的关系型数据库管理系统,为了保证MySQL的性能和稳定性,有一些最佳实践可以遵循:正确配置内存:MySQL需要大量的内存来缓存数据和查询结果,确保MySQL有足够的内存......
  • navicat mysql表分组
    Navicat分组功能,主要体现在vgroup.json。生产环境设置好分组之后,其他环境也需要怎么操作:1)vgroup.json文件的位置:编辑数据库链接->高级->设置位置把生产环境中的json......
  • MySQL数据库报错:Too many connection
    一般遇到这种情况就是由于mysql最大连接数满了,如果这个时候再有新的链接进去的话,会进不去,所以需要修改MYSQL的max_connections参数的设置,扩大数据库的最大连接数。 1、查......