`
天涯之海
  • 浏览: 48794 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

数据库优化

阅读更多

数据库优化的目标无非是避免磁盘 I/O 瓶颈、减少 CPU 利用率和减少资源竞争。

1、 在业务密集的 SQL 当中尽量不采用 IN 操作符

2、   不使用 not in 因为它不能应用表的索引。 not exists 或(外连接 + 判断为空)代替

3、   不使用 <> ,因为用它只会产生全表扫描。( a<>0 改为 a>0 or a<0

4、   不使用 is null is not null 判断字段是否为空一般不用到索引。( a is not null 改为 a>0

5、   a>=3 代替 a>2 ,因为 a>2 时,会先找出 a 2 的记录索引再进行比较,而 a>=3 时,会直接找到 a=3 的索记录引再进行比较。

6、   尽量不使用 like %005% (比如前面的 % 确定在 {A,B} 内,用 A005% or B005% 代替 %005%

7、   union 在进行表链接后会筛选掉重复的记录。因此会用到排序运算。(若确定没有重复记录的用 union all 代替 union

8、   where 条件顺序的影响。(如 select * from T where a=’abc’ and b=1 a=”abc” 在数据库中的记录比 b=1 在数据库中的记录多,则把 b=1 放在前面)

9、   尽量避免以下情况:

采用函数处理的字段不能利用索引

进行了显示或隐式运算的字段不能进行索引(把 a-5=b 改为 a=b+5

条件内包括多个本表字段不能进行索引

10 、合理使用索引,使用索引的原则:

在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

在频繁进行排序或分组(即进行 group by order by 操作)的列上建立索引。

在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。(比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。)

如果待排序的列有多个,可以在这些列上建立复合索引( compound index    

当数据库表更新大量数据后,删除并重建索引可以提高查询速度

11 避免或简化排序:为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等

12 、消除对大型表行数据的顺序存取:在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3 层的查询,如果每层都查询1000 行,那么这个查询就要查询10 亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where 子句强迫优化器使用顺序存取。下面的查询将强迫对orders 表执行顺序操作:

SELECT FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在customer_numorder_num 上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECT FROM orders WHERE customer_num=104 AND order_num>1001

UNION

SELECT FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

13 、避免相关子查询:一个列的标签同时在主查询和 where 子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

14 、避免困难的正规表达式( like ):这种匹配特别耗费时间。例如: SELECT FROM customer WHERE zipcode LIKE 98_ _ _ 即使在 zipcode 字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为 SELECT FROM customer WHERE zipcode > 98000 ,在执行查询时就会利用索引来查询,显然会大大提高速度。

15 、使用临时表加速查询:把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

SELECT cust.name rcvbles.balance ,…… other columns

FROM cust rcvbles

WHERE cust.customer_id = rcvlbes.customer_id

AND rcvblls.balance>0

AND cust.postcode>“98000”

ORDER BY cust.name

如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

SELECT cust.name rcvbles.balance ,…… other columns

FROM cust rcvbles

WHERE cust.customer_id = rcvlbes.customer_id

AND rcvblls.balance>0

ORDER BY cust.name

INTO TEMP cust_with_balance

然后以下面的方式在临时表中查询:

SELECT FROM cust_with_balance

WHERE postcode>“98000”

临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘 I/O ,所以查询工作量可以得到大幅减少。

注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

16 、用排序来取代非顺序存取:在连接列上建立索引。(若非顺序存取表的数据不经常改变,可以建立排序后的临时表,再进行查询。注意:临时表不反映主表的改变。)

17 、有大量重复值、且经常有范围查询( between, >,< >=,< = )和 order by group by 发生的列,可考虑建立群集索引

18 、经常同时存取多列,且每列都含有重复值可考虑建立组合索引

19 、组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列

20 、注意 where 字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

21 、尽量使用 exists 代替 select count(1) 来判断是否存在记录, count 函数只有在统计表中所有行数时使用,而且 count(1) count(*) 更有效率

22 、尽量使用“ >= ”,不要使用“ >

23 、尽可能的使用索引字段作为查询条件,尤其是聚簇索引

24 、在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用

分享到:
评论

相关推荐

    非常好的数据库优化教程02

    【非常棒的数据库优化教程02】 在数据库管理中,优化是提高系统性能的关键环节,尤其是在处理大量数据和复杂查询时。本章节主要探讨如何利用MySQL进行有效的数据库优化,包括索引的使用、选择合适的列类型、优化SQL...

    有关数据库优化以及优化措施方面的论文

    数据库优化工具在这一过程中也起着重要作用。ORACLE提供了各种工具,如SQL*Plus、DBMS_XPlan、AWR(Automatic Workload Repository)和ASH(Active Session History),帮助管理员分析性能瓶颈,生成执行计划,监控...

    mysql数据库优化的学习心得

    MySQL 数据库优化技巧总结 MySQL 数据库优化是数据库管理和开发者非常关心的一个问题。由于 MySQL 数据库的性能优化可以直接影响到整个应用系统的性能和用户体验,因此掌握 MySQL 数据库优化技巧对开发者和数据库...

    sql数据库优化方案

    在IT行业中,数据库优化是提升系统性能的关键环节,尤其是在处理大量数据时,SQL数据库的优化显得尤为重要。本文将深入探讨SQL数据库优化方案,包括查询优化、索引优化、存储优化和架构优化等策略,旨在帮助你提升...

    SQL数据库优化工具

    当数据库性能下降时,"SQL数据库优化工具"就显得至关重要。这些工具能够帮助我们诊断问题、提高查询效率并优化整体数据库结构,确保系统运行顺畅。 一、SQL查询优化 SQL查询优化是数据库优化的关键部分,它涉及到...

    mysql数据库优化方案(值得学习)

    简单描述数据库优化方案,以及数据库一些常用的操作,包括一些简单的查询语句,函数使用,合适学习mysql的读者。 简单描述数据库优化方案,以及数据库一些常用的操作,包括一些简单的查询语句,函数使用,合适学习...

    数据库优化大全(面试常问到)

    数据库优化是IT领域中至关重要的一个环节,尤其是在大数据量、高并发的系统中,数据库性能的优劣直接影响到系统的响应速度和用户体验。本压缩包包含了关于数据库优化的多个文档,如"SQL语句优化.doc"、"数据库优化:...

    《数据库优化与集成之实战和效果 郑保卫》PDF课件

    《数据库优化与集成之实战和效果》是由郑保卫编著的一本关于数据库管理与优化的专业教材,主要针对数据库系统在实际应用中的性能提升和不同数据库的整合策略进行深入探讨。PDF课件形式使得读者可以方便地在线学习或...

    SQL数据库优化方法

    在IT领域,数据库优化是确保系统性能的关键环节,特别是对于SQL Server这样的大型关系型数据库管理系统。本文将深入探讨SQL数据库的优化方法,包括网络优化、硬件优化、操作系统优化、数据库参数调整以及应用程序...

    Oracle数据库优化详解

    Oracle数据库优化是一门深入的技术领域,它关系到数据库性能的提升和资源的高效利用。本文针对Oracle数据库的优化提供了详尽的指导和案例分析,尤其强调了在CBO(Cost-Based Optimizer,基于成本的优化器)模式下的...

    C#源码 访问ACCESS数据库 通过反射调用命令 清理数据库 执行数据库优化 压缩操作

    数据库优化包括多个方面,如索引优化、查询优化和存储优化。在Access中,可能需要检查和调整索引以提高查询速度,分析查询性能,以及合理分配内存资源。C#可以通过执行存储过程或者自定义的SQL脚本来完成这些任务,...

    sql server 2005数据库优化方法

    在SQL Server 2005中,数据库优化是提高系统性能和效率的关键环节。本文将介绍两种主要的数据库优化工具:SQL Server Profiler和数据库引擎优化顾问(Database Engine Tuning Advisor),以及它们如何帮助DBA们更好...

    ORACLE数据库优化基础培训.zip

    进行Oracle数据库优化是提升系统性能、确保数据高效稳定运行的关键。本次基础培训将重点聚焦在SQL语句性能优化、数据库的常用管理命令以及常见问题处理上。 一、Oracle之SQL语句性能优化 SQL(Structured Query ...

    Oracle 数据库优化技术手册.pdf

    Oracle数据库优化是一项系统工程,涉及程序设计、操作系统优化、硬件配置、数据库配置以及SQL语句等多个层面。为了提高Oracle数据库的性能,需要对这些层面进行综合考虑,逐一优化。 首先,硬件优化是基础,主要...

    ( 数据库优化方面.rar )

    ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面.rar ) ( 数据库优化方面...

    数据库优化培训课件

    数据库优化培训课件,供大家一起参考学习。

    oracle 数据库优化

    Oracle数据库优化是一个复杂而关键的领域,涉及到许多层面,包括SQL查询优化、索引策略、内存结构调整、数据库架构设计以及硬件配置等。以下将详细阐述这些知识点。 首先,SQL查询优化是数据库优化的核心部分。...

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    接下来,"数据库SQL优化总结之百万级数据库优化.pdf"可能深入到实际的优化实践。 1. **数据库架构设计**:在百万级数据量下,合理的设计能避免性能瓶颈,如垂直分割、水平分割,以及读写分离策略。 2. **缓存与...

Global site tag (gtag.js) - Google Analytics