SQL性能优化十条经验,是个后端程序员都需要掌握

2023-05-30 0 852

1.查阅的模糊不清相匹配

尽量防止在两个繁杂查阅里头采用 LIKE %parm1%—— 黄色标记边线的SOH会引致有关列的检索难以采用,最合适千万别用.

解决之道:

只不过只须要对该JAVA略做改良,查阅速率便会提高近十倍。改良方法如下表所示:

a、修正前台流程——把查阅前提的分销商中文名称附注由原本的文档输出改成下拉列表,使用者模糊不清输出分销商中文名称时,间接在前台就帮功能定位到具体内容的分销商,这样在初始化前台流程时,这列就可以间接用等同于来关联了。

b、间接修正前台——根据输出前提,先验出符合前提的分销商,并把有关历史记录留存在两个临时性表里边,然后皮德盖临时性西略做繁杂关连

SQL性能优化十条经验,是个后端程序员都需要掌握

2.检索难题

在做操控性追踪分析过程中,时常发现有许多前台流程的操控性难题原因在于缺少最合适检索引致的,有些表甚至两个检索都没有。这种情况常常都原因在于在结构设计表时,讲错表述检索,而合作开发末期,由于表历史记录极少,检索建立是否,可能对操控性没啥负面影响,合作开发者因此也未多加倚重。然除非流程正式发布到生产环境,随着时间的流逝,表历史记录愈来愈多

此时缺乏检索,对操控性的负面影响便会愈来愈大了。

自然法则:千万别在建立的检索的数据列上展开以下操作方式:

◆防止对检索表头展开排序操作方式

◆防止在检索表头上采用not,<>,!=

◆防止在检索列上采用IS NULL和IS NOT NULL

◆防止在检索列上出现数据类型转换

◆防止在检索表头上采用函数

◆防止建立检索的列中采用空值。

SQL性能优化十条经验,是个后端程序员都需要掌握

3.繁杂操作方式

部分UPDATE、SELECT 语句 写得很繁杂(时常嵌套多级子查阅)——可以考虑适当拆成几步,先生成一些临时性数据表,再展开关连操作方式

4.update

同两个表的修正在两个过程里出现好几十次,如:

update table1 set col1=… where col2=…; update table1 set col1=… where col2=… ……

象这类JAVA只不过可以很简单就整合在两个UPDATE语句来完成(前些时候在协助xxx项目做操控性难题分析时就发现存在这种情况)

SQL性能优化十条经验,是个后端程序员都需要掌握

到了这里可能很多人

全套laravel框架、ThinkPHP框架全套教程分享,PHP流程员福利!

PHP合作开发三年只懂增删改查?那是你没有规划好php学习路线

5.在可以采用UNION ALL的语句里,采用了UNION

UNION 因为会将各查阅子集的历史记录做比较,故比起UNION ALL ,通常速率都会慢上许多。一般来说,如果采用UNION ALL能满足要求的话,务必采用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集须要过滤掉重复历史记录,但由于JAVA的特殊性,不可能存在重复历史记录,此时便应该采用UNION ALL,如xx模块的某个查阅流程就曾经存在这种情况,见,由于语句的特殊性,在这个JAVA中几个子集的历史记录绝对不可能重复,故可以改用UNION ALL)

6.在WHERE 语句中,尽量防止对检索表头展开排序操作方式

这个常识相信绝大部分合作开发者都应该知道,但仍有许多人这么采用,我想其中两个最主要的原因可能是为了编写写简单而损害了操控性,那就不可取了

9月份在对XX系统做操控性分析时发现,有大量的前台流程存在类似用法,如:

…… where trunc(create_date)=trunc(:date1)

虽然已对create_date 表头建了检索,但由于加了TRUNC,使得检索难以用上。此处正确的写法应该是

where create_date>=trunc(:date1) and create_date<trunc(:date1)+1< pre=””>

或者是

where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)

注意:因between 的范围是个闭区间(greater than or equal to low value and less than or equal to high value.),

故严格意义上应该再减去两个趋于0的小数,这里暂且设置成减去1秒(1/(24*60*60)),如果千万别求这么精确的话,可以略掉这步。

7.对Where 语句的自然法则

7.1 防止在WHERE子句中采用in,not in,or 或者having。

可以采用 exists 和not exists代替 in和not in。

可以采用表链接代替 exist。Having可以用where代替,如果难以代替可以分两步处理。

例子

SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN (SELECT CUSTOMER_NAME FROM CUSTOMER)

强化

SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist (SELECT CUSTOMER_NAME FROM CUSTOMER)

7.2 不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使检索无效,产生全表扫描。

例子采用:

SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;

千万别采用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = ‘7369’

8.对Select语句的自然法则

在应用流程、包和过程中限制使用select * from table这种方式。看下面例子

采用SELECT empno,ename,category FROM emp WHERE empno = 7369‘

而千万别采用SELECT * FROM emp WHERE empno = 7369

9. 排序

防止采用耗费资源的操作方式,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT须要一次排序操作方式, 而其他的至少须要执行两次排序

10.临时性表

慎重采用临时性表可以极大的提高系统操控性

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务