SQL优化

114 阅读10分钟

一、SQL优化的必要性

SQL优化作为数据库优化的一个重要环节,因为性能不佳的语句也是影响系统运行的关键因素之一,随着数据库相关对象以及数据量的改变,需要对sql语句进行不断的效能调整,对海量的数据而言,优质SQL语句与劣质语句间的速度差别能够到达百倍以上或者更多。SQL优化不仅仅会提升查询数据的效率,而且会提升修改数据的效率,因为修改数据的时候是先会把数据查询数据出来再进行操作。

二、影响SQL数据库性能的一些主要问题

1.数据库的设计问题

首先,表的设计.对表的设计需要依据具体的情况进行,处理好表中的每一个细节和样式,减少给数据库数据分析的清晰度以及数据信息的准确性造成的影响.其次,索引的设计.使用索引可快速访问数据库表中的特定信息,与书本中的目录相似,能够提高检索效率.索引的设计是否符合要求、是否得当对SQL数据库的具体执行速度有直接的、决定性的关系,理解索引是进行数据库性能调优的起点.再次,视图的设计.其是查看数据库中的数据信息的主要方法之一,它的好坏对数据的查看以及处理有着直接的影响.最后,数据的设计.在进行数据设计时应将繁杂的内容简单化,以达到一看就懂的效果,否则用户难以接受.应减少多余的数据信息,多余的信息会给用户操作带来一定的困难,在数据库进行回复数据与多方连接时也会引发一些负面的影响.

2.事物的管理问题

事务是指逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功, 要么一起失败,是一个不可分割的工作单位,其具有原子性、一致性、隔离性和持续性的特征.编写合理有效的事务,并进行科学的管理,对保持数据库的完整性,提高数据库系统效率有巨大的积极意义.

3.应用程序的质量问题

根据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升全部加起来只占数据库应用系统性能提升的40%左右,其余60%的系统性能提升全部来自对应用程序的优化.

4.硬件的配置问题

在计算机中,其系统主要分成软件系统与硬件系统两个部分,其中,硬件系统是软件系统的载体,硬件配置的高低对计算机运行速度与效率有直接影响.虽然我国大部分区域都已经普及计算机,但是因计算机的硬件配置上还存在一些不足,使得SQL 数据库的性能在配置不足的计算机上难以正常发挥.

三、优化SQL的主要措施

1.对索引的优化措施

在SQL做优化,其主要还是通过索引来进行优化,主要思路就是先保证我们的查询都使用到了索引,然后在使用到索引的情况下再根据执行计划对type、key_len、row、 extra进行分析,因为SQL的优化会根据业务情况分不同的场景,优化方式也不同。 创建以及使用索引,应该注意以下几点:

(1)在where中出现频繁的列上创建索引,由于where子句中对列的任何操作结果都是在SQL运行时逐行计算得到的,因此它不得不进行表扫描;(2)频繁操作的order by或group by操作的列上建立索引;(3)尽量不在要重复率高的字段上建立索引;(4)对于小于5M的表,就不要使用索引;(5)多列进行排序的,可建立复合索引在列上,但尽量少用复合索引;(6)对数据记录进行大批量的操作(delete、insert),最好将索引先删除,进行数据操作后再重新建立必要索引;(8)数据类型要注意匹配;(9)对于操作符的使用,要避免使用!=或<>等,这样会造成系统无法用索引,而是直接从表中搜索数据。(10)避免对列的操作,任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数;(11)避免不必要的类型转换,如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致全表扫描;(12)增加查询的范围限制,增加查询的范围限制,避免全范围的搜索;(13)尽量去掉"IN"、"OR",含有"IN"、"OR"的Where子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开,拆开的子句中应该包含索引;

2.对语句的优化措施

SQL的语句优化指的是将原本散乱繁杂的语句经相关处理手段与技术改进之后,变成具有一致性与统一性的新语句,SQL语句消耗了70%-90%的数据库资源,所以对语句的优化是数据库性能优化的重点.传统的优化方法是采用手工重写的方式,通过校验比对来获取性能较佳的语句,这完全依赖于人的经验,经验的多寡决定了优化后SQL语句的性能.另外一种方法是使用优化工具,对语句优化的工具主要包括:(1)执行计划与分析工具:这类工具对输入的SQL语句从数据库提取执行计划,并对执行计划中关键字的含义进行解释;(2)添加索引建议的SQL语句优化工具:其主要是通过对输入的SQL语句的执行计划的分析来产生是否要增加索引的建议;(3)人工智能SQL语句优化工具:如LECCOSQL Expert,其本质上是借助于人工智能技术,对SQL语句自动重写,并获取性能最好的SQL语句.

3.服务器配置的优化措施

CPU是保障计算机正常运行的基础,其在维护时也作为重点对象进行保护,CPU一旦在较高速率下进行长时间的工作,就要注意及时对其进行升级.内存作为计算机存储器,其主要作用就是存储程序与数据,所以内存的状态良好是SQL数据库功能优化的关键.而在内存中,若是系统占用过大会影响程序的正常运行,因此,必须在设计SQL数据库时尽量不占用过多内存.此外,磁盘也会影响到数据库运行的效率,处理的关键就是增加磁盘容量和提高磁盘I/O性能.

4.物理的优化措施

在物理优化中,首先要对文件组进行优化,将多个磁盘驱动器内的特定对象移到单个磁盘当中,并将数据库的文件分成多个文件组,在用户使用时可利用已分好的文件组实施查询与修改等工作,从而提高数据库性能;其次对磁盘进行优化,使用RAID(独立冗余磁盘阵列)可以增强数据整合度,增强容错功能,增加吞吐量或容量,在一个磁盘出现故障时其他磁盘可以替代,提高数据库可靠性.

四、SQL优化的原则

1.尽可能使用覆盖索引

简单来说就是我们的列数据只需要通过索引就可以获得数据,不需要从数据表中区遍历数据,这种索引就已经覆盖了需要查询的列数据情况称为覆盖索引。

在mysql里分为聚集索引和辅助索引。聚集索引既是索引又是表数据,而辅助索引里保存的则是聚集索引的键,使用mysql辅助索引查询数据时都是先从辅助索引获取到聚集索引的索引键,然后用索引键从聚集索引中找到对应的表数据。所有通过辅助索引查询数据其实都是先从辅助索引查询到聚集索引的索引key,然后用聚集索引的key从聚集索引里面查找数据,通常也称这个过程为回表,按照覆盖索引,当我们查询的字段已经包含在索引里面时,那么我们就不需要从聚集索引里面去查询数据了,因为你所查询的列本身就是索引的key,那么直接返回当前索引的Key就行了,这就个过程就减少了一次从聚集索引查询表数据的过程,当我们查询的数据越多那么这个效率显而易见会得到巨大的提升,所以这也是覆盖索引的好处。

2.最左匹配原则

最左匹配原则是指,索引在进行模糊匹配时,必须最左边开始匹配。最左前缀匹配原则,我们在建立索引的时候,如果是联合索引,你一个表第一个字段是id 第二个字段是 name 第三个字段是age,(id,name,age),三个字段都有索引,就是先按id排序,然后在第一个前提下再对name排序,再对 age排序,都是在前一个索引排好序的前提下再继续下面的。如果你是一上来就是直接第三个索引范围查询就不行,如果你先第一个索引查然后第二个索引范围查询,那就是可以的,必须要按顺序来。

详细示例:比如五个人名字为 A A A B B ,age分别为 2 3 4 1 2,按名字和age建索引先是 (A 2) (A 3) (A 4) (B 1) (B 2),再按照age排序 但是A索引大前提不变 也就是A 在B前面,现在age规则是从大到小(A 4) (A 3) (A 2) (B 2) (B 1)。

3.小的结果驱动大的结果

使用JOIN 时候,应该用小的结果驱动大的结果(left join 左边表结果尽量小 如果有条件应该放到左边先处理,right join 同理反向),同事尽量把牵涉到多表联合的查询拆分多个query(多个连表查询效率低,容易到之后锁表和阻塞)。

五、结语

Oracle是一种适用于大型,中型和微型计算机的关系数据库管理系统,其性能的优化问题一直是人们关注的焦点.影响数据库性能的一个重要因素就是SQL查询语句的执行效率.本文给出了优化SQL查询语句的必要性,并介绍了在Oracle数据库中SQL优化的部分原则和方法,证明了SQL语句优化大大提高了数据库的性能.