置顶

数据库优化

数据库的优化(常见方法)

关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂

偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助。

1、对查询进行优化,要尽量避免全表扫描,首先应该考虑在where以及order by涉及的列上建立索引。形如:

1
select * from tablename;#应该尽量避免这种方式

修改为:

1
select id from tablename where name = 'admin'

2、应该尽量避免在where字句中对字段进行null判断,否则将导致引擎放弃索引而进行全表扫描。形如:

1
select id from tablename where num is null

最好不要给数据库留null,尽可能使用not null填充数据库。

3、应该尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引进行全表扫描。

4、应尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。形如:

1
select id from tablename where num = 10 or name = 'admin';

修改为:

1
2
3
select id from tablename where num = 10
union all
select id from tablename where name = 'admin';

5、in和not in也要慎用,否则会全表扫描。形如:

1
select id from tablename where num in(1,2,3);

对于连续的数值,能用between就不要用in

修改为:

1
select id from tablename where num between 1 and 3; 

6、使用索引。索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。

一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况

例如customerinfo中的“province”..字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引,也可以使用ALTERTABLE或CREATEINDEX在以后创建索引。此外,MySQL从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL中是一个FULLTEXT类型索引,但仅能用于MyISAM类型的表。对于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX创建索引,将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中,执行过程将会非常慢。

7、使用外键。锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。

例如:外键可以保证每一条销售记录都指向某一个存在的客户。在这里,外键可以把customerinfo表中的CustomerID映射到salesinfo表中CustomerID,任何一条没有合法CustomerID的记录都不会被更新或插入到salesinfo中。

1
2
3
CREATE TABLE customerinfo(CustomerIDINT NOT NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;
CREATE TABLE salesinfo(SalesIDNT NOT NULL,CustomerIDINT NOT NULL,PRIMARYKEY(CustomerID,SalesID),
FOREIGNKEY(CustomerID) REFERENCES customerinfo(CustomerID) ON DELETE CASCADE)TYPE=INNODB;
-------------本文结束感谢您的阅读-------------