数据库的优化(表优化和sql语句优化)

时间:2022-05-09 20:43:30

在这里主要是分为表设计优化和sql语句优化两方面来实现。

首先的是表设计优化:

1.数据行的长度不要超过8020字节。如果是超过这个长度的话这条数据会占用两行,减低查询的效率。

2.能用数字类型就不要用字符串类型。字符串类型的会降低查询的效率并且增加存储。因为引擎在进行查询的的时候会逐个的比较字符串中 的每一个字符,而对应的数值类型的只需要比较一次就可以了。

3.对于不可变字符类型 char 和可变字符类型 varchar 都是 8000 字节,char查询快,但是耗存储空间,varchar 查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择 VARCHAR。

4.字段在满足要求的情况下尽量的短一些,这样可以提高查询效率,并且在建立索引的时候可以减少资源的消耗。

查询的优化:就是尽量的避免全表查询

1.应该尽量避免在where条件里面进行null的判断,这样会查询的时候放弃索引而进行全表查询

2.应该尽量避免在where字句中使用!=,<,>这些符号,否则的话就会放弃使用索引而进行全表扫描。这是因为优化器无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

3.应该尽量的避免在where子句中使用or来连接条件,否则会导致放弃使用索引而进行全表扫描。

例如:

select username from user where id=10 or id=20;  
 

  

应该改为:

select username from user where id=10
union all
select username form user where id=20; 

4.in 和not in也要慎用。因为in会使系统无法使用索引,而只能直接搜索表中的数据。

如(这是对应与连续的值来说的):

select username from user where id in (1,2);   

应该改为:

select username from user where id between 1 and 2;   .

5. 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。

见如下例子:

1. Select * FROM T1 Where NAME LIKE ‘%L%’
2. Select * FROM T1 Where SUBSTING(NAME,2,1)=’L’
3. Select * FROM T1 Where NAME LIKE ‘L%’

即使 NAME 字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎
不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快
操作。

6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:可以改为强制查询使用索引:

select id from t with(index(索引名)) where num=@num.

7.应该尽量避免在where字句中对字段进行表达式操作,这将导致放弃索引而使用全表扫描。

select * from user where math/2=45;  

 应该改为:

select * from user where math=45*2;  

 也就是任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

8.应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

9.不要在where字句的“=” 左边进行函数,算术运算或者其他表达式运算,否则系统无法正确使用索引。

10.在使用索引作为字段条件时,如果是复合索引,那么必须使用该索引中的第一个字段作为条件才能保证系统使用该索引,否则该索引是不会被使用的,并且尽可能的让字段顺序与索引顺序相一致。

11.使用exists替代in

1.  elect num from a where num in(select num from b)
select num from a where exists(select 1 from b where num=a.
num)

12.避免使用不兼容的数据类型。例如float 和int、char 和varchar、binary和 varbinary 是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。

13.能用 UNION ALL 就不要用 UNIONUNION ALL 不执行 Select DISTINCT 函数,这样就会减少很多不必要的资源。

14.尽量不要用 Select INTO 语句。Select INOT 语句会导致表锁定,阻止其他用户访问该表

 2017-10-16