数据库优化
数据库的优化(常见方法)
关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂
偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助。
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 | select id from tablename where num = 10 |
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 | CREATE TABLE customerinfo(CustomerIDINT NOT NULL,PRIMARYKEY(CustomerID))TYPE=INNODB; |