数据库的性能优化

1、性能测试相关术语介绍。算法

        1.响应时间。sql

        客户端显示时间,如何将服务器传过来的页面尽快显示到浏览器上,是开发 人员须要考虑的问题,这里面涉及算法优化等问题。这也是开发人员容易忽视的地方。数据库

        2.吞吐量浏览器

        是指单位时间内流经被测系统的数据流量,通常单位为b/s,即每秒钟流经的字节数。服务器

        吞吐量和不少相关的因素有关,好比服务器的硬件配置,网络的拓扑结构,软件的技术架构等。相对于对电子商务网站来讲要求比较高。网络

        3.并发架构

        并发,是指多个同时发生的操做。并发

        须要注意的是,并发和并行不是一个概念,并发是同时发生,并行是同步运行。数据库设计

        4.稳定性测试函数

        也叫可靠性测试,是指连续被测系统,检查系统运行时的稳定程度。

        5.负载测试

        一般是指让被测系统在其能忍受的压力的极限范围以内连续运行,来测试系统的稳定性。假如如今的并发用户数为20,咱们就用这20个用户同时屡次重复登入,直到系统出现故障为止。负载测试为咱们测试系统在临界状态下运行是否稳定提供一种方法。

        6.压力测试

        一般指接二连三的给被测系统增长压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。好比咱们不断增长并发的登入用户数,直到崩溃。

        以上为相关术语的介绍。

2、建立数据库时的优化

        1.建表

        通常把主键ID设置为自动增加,方便查询,同时ID为int类型。同时会加上建立时间和删除事件。

        2.总结

        检查ER中各个表之间的关系是否合理。

        检查每一个数据表的字段类型和长度,看是否影响性能的地方。

        检查触发器和存储过程所对应的SQL语句,是否有须要改进的地方,以提升执行效率。

        索引设计是否合理。

3、数据库对象级别的优化

        包括如下方面:数据库范式设计的优化,数据表设计的优化,索引设计的优化,以及sql语句的优化。

        1.范式设计的优化

        遵照范式的规则,  数据库设计时会产生较少的列和更多的表,于是也就减小了数据冗余,但同时表关系也变得复杂起来,查询某一条记录时,每每须要合并多个表来处理,这样会下降系统性能。      

        如何平衡呢?这就须要咱们对设计的系统很是熟悉,清楚地知道哪些数据是要被常常访问和重复查询的,而哪些数据只是偶尔会被操做,对于常常被查询和操做的数据所在的数据库,能够适当的放宽范式设计的标准。

        设计过程以下:1).若是真的须要在两个表之间,使用第三范式,那么咱们就要在这两个表之间创建一个关联表。好比学生和课程,一个学生对应多个课程,一个成绩对应多个课程。若是须要知道成绩,即须要学号,也须要课程。这样的话能够建立一个存储过程完成上述要求,并在空闲的时候加以执行。

        2).将经常使用的计算字段(好比求和,求平均值)放入数据表中。

        3).将一个数据表拆分红两个部分。这里面的是拆分又包括了拆分列和拆分行。拆分列指的是若是是一个数据表中的字段是有一部分会被频繁使用,而另外一部分基本不会被使用,则能够考虑按照使用频率将该数据库拆分红两个表。拆分行指的是若是一个数据表中的一部分记录会被频繁使用,而另外一部分记录却不多被使用,则能够拆分两个表。

        2.表设计的优化选择

        1).除非必要,避免使用容许null值的列和可变长度的列,处理null值会带来额外的开销。

        2).视图的处理速度并非很快,若是能在程序中直接实现视图的功能最好。

        3).视图只是逻辑结构,一般使用视图时要过滤某些固定的数据;固然,使用视图时要考虑效率,若是两个大表关联,那查询速度是很慢的,使用临时表。

        4).字段的长度够用就好,不要浪费空间。

        5).若是开发的系统是单一语言的,就不须要Unicode的数据类型。

        6).外键约束的处理速度比触发器要快的多。

        7).避免使用text类型的字段。

        8).正确的使用索引。

        9).对于日期类型来讲,使用smalldatetime类型就能够了。

        3.索引的优化选择

        索引主要分为聚簇索引(也称为聚类索引)和非聚簇索引,一个数据表只能有一个聚簇索引,能够有多个非聚簇索引。合理的使用索引能够大大提升数据的查询速度,是优化数据表查询性能的最经常使用途径之一。可是在添加聚簇索引的时候必定要考察目标数据表的特色,由于它会下降数据的插入和更新速度,若是数据表中的数据会频繁的更新的话,建议不要使用。

        如何使用聚簇索引和非聚簇索引呢?        

两种索引使用的时机

目标列 聚簇索引 非聚簇索引
常常被分组排序 应该使用 可使用
含有小数目的不一样值 应该使用 不该使用
含有大数目的不一样值 不该使用 应该使用
极少有不一样值比,如性别 不该使用 不该使用
频繁更新的列 不该使用 应该使用

 

注意:认为就应该在主键建立聚簇索引,虽然字段ID比较适合作主键(惟一性),但因为其含有大数目的不一样值,并不适合用聚簇索引。咱们应用聚簇索引的方法就是看哪个字段在查询条件中应用的最为频繁。好比用户ID主键,就能够创建一个。

        最好选择查询条件中的使用最频繁的字段做为前导列,放在复合索引的最前面。对于多个字段一块儿频繁出现的状况可使用复合索引,而且将使用最频繁的查询条件做为复合索引的前导列。

        4.SQL语句级别的优化

        数据的原则:

        1).使用select语句查询时,尽可能不要使用select * 语句,而是应该指明具体要查询的字段,提取的字段数量越少,查询的速度越快。

        2).使用order by语句排序时,最好按照聚簇索引的字段排序,这样会大大提升排序的速度。

        3).尽可能不要使用or 关键字,或是in(),不然会引发全表扫描,大大下降数据的检索速度。

        4).对笛卡尔积、游标、循环要谨慎使用。

        5).存储过程、函数、包、触发器等尽可能不要超过1000行,之间调用不要复杂。

        6).order by 、group by、distinct这些语句运行时相对来讲会占用较大内存,使用需加以注意。

        7).检查嵌套、递归、子查询,最好不要超过3层。

        8).尽可能少用not,包括not in和 not exist。

        9).between 1 and 10 要比 in(1,10)的执行效率高。

        10).数值类型的字段要比字符串类型的字段执行效率高。

        11).当where语句后有多个查询条件时,应该将数据量大的表查询过滤条件放在前面。

        12).like语句是很耗时间的,若是容许的话,可使用功能相同的语句代替。

        13).尽可能不要在sql语句中进行对列的操做,包括数据库函数,计算表达式等,不然会致使表扫描。要尽量将操做移至等号右边。好比应该写成这样: select * from user where score >10*10。

相关文章
相关标签/搜索