数据库优化总结 1.SQL语句级别的优化 2.表设计的优化 3.索引的优化 4、采用缓存 5、预处理 6、分表分库 7、读写分离
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语句中进行对列的操作,包括数据库函数,计算表达式等,否则会导致表扫描。要尽可能将操作移至等号右边。
2.表设计的优化
1).除非必要,避免使用允许null值的列和可变长度的列,处理null值会带来额外的开销。
2).视图的处理速度并不是很快,如果能在程序中直接实现视图的功能最好。
3).视图只是逻辑结构,通常使用视图时要过滤某些固定的数据;当然,使用视图时要考虑效率,如果两个大表关联,那查询速度是很慢的,使用临时表。
4).字段的长度够用就好,不要浪费空间。
5).如果开发的系统是单一语言的,就不需要Unicode的数据类型。
6).外键约束的处理速度比触发器要快的多。
7).避免使用text类型的字段。
8).正确的使用索引。
9).对于日期类型来说,使用smalldatetime类型就可以了。
3.索引的优化
索引主要分为聚簇索引(也称为聚类索引)和非聚簇索引,一个数据表只能有一个聚簇索引,可以有多个非聚簇索引。合理的使用索引可以大大提高数据的查询速度,是优化数据表查询性能的最常用途径之一。但是在添加聚簇索引的时候一定要考察目标数据表的特点,因为它会降低数据的插入和更新速度,如果数据表中的数据会频繁的更新的话,建议不要使用。
如何使用聚簇索引和非聚簇索引呢?
两种索引使用的时机
目标列 |
聚簇索引 |
非聚簇索引 |
经常被分组排序 |
应该使用 |
可以使用 |
含有小数目的不同值 |
应该使用 |
不应使用 |
含有大数目的不同值 |
不应使用 |
应该使用 |
极少有不同值比,如性别 |
不应使用 |
不应使用 |
频繁更新的列 |
不应使用 |
应该使用 |
注意:认为就应该在主键创建聚簇索引,虽然字段ID比较适合做主键(唯一性),但由于其含有大数目的不同值,并不适合用聚簇索引。我们应用聚簇索引的方法就是看哪一个字段在查询条件中应用的最为频繁。比如用户ID主键,就可以建立一个。
最好选择查询条件中的使用最频繁的字段作为前导列,放在复合索引的最前面。对于多个字段一起频繁出现的情况可以使用复合索引,并且将使用最频繁的查询条件作为复合索引的前导列。
4、采用缓存
针对少变化的数据或高访问的数据进行缓存,减少数据库的访问次数
5、预处理
比如报表,系统定期统计产生,非实时。oracle可建物理视图……
6、分表分库
根据数据库,重新对业务进行设计。
7、读写分离
一个数据库只用来查询,一个数据库只用来数据插入。