数据库系列(二)之 开发规则与优化

前言

      在数据库中,有很多开发规则。应尽量避免在数据库中过度使用数据库的功能。过度使用会导致数据库慢,再加上数据库是很难扩展的。过多的逻辑在数据库中处理,以后分库、分表比较难处理。当然对于简单的应用,无需有这么多的规则。以下规则,都是大部分是高并发环境下的规则。

对于所有应用,建议规则

1)数据库不存储大文件、图片。

有些人很喜欢在数据库中存储整个文件、图片的base64,这样只会加大数据库的压力。一般只存储路径、url即可。

2)表、字段、数据库用英文、拼音。

在代码规范中,我们都建议使用英文,甚至拼音。使用中文显得很落后。所以在数据库中必须也如此。使用中文,在数据库中可能发生乱码等意想不到的问题。

3)尽量使用Join方式替换子查询

因为子查询会导致性能低下。例如在Mysql中,子查询明显是比Join慢的,子查询需要创建临时表。

4)Join联表查询条件尽量使用索引

Join查询太消耗数据库性能,使用索引的条件能大大增加查询效率。

5)能使用索引的地方使用索引,不能使用索引的地方不使用索引

对于字段值多相同的,尽量避免使用索引。这样没达到你的目的,反而增加数据库的压力。因为插入数据时会变慢,并且索引占用空间。

并不是索引越多越好,反而会导致数据库的压力过大。

对于经常使用作为查询条件,并且是重复率不高的字段,尽量使用索引,大大提升查询效率。

6)避免数据类型的隐形转换而导致的性能底下

在表中的类型,与查询的类型不一致,会导致查询性能底下,甚至是全部查询。但是有些数据库的类型查询语句是非常严格的,例如Postgresql。

例如user表,在数据库中的telphone是字符串类型,而查询时使用select telphone from user where telphone=0208653266

正确是使用select telphone from user where telphone='0208653266'

7)避免错误使用查询条件导致的全表扫描

a. NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,这些负向查询条件会导致全表扫描

b. %开头的模糊查询,会导致全表扫描

c. 避免数据库中

8)尽量避免数表字段值可以为null

表字段中设有默认值,并且可不为空。否则可能会导致全表扫描。

例如select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

9)不使用查询时select *号

用具体的字段代替*号查询,而不用select * from t。因为会消耗数据库的IO性能、不能有效的利用覆盖索引。

10)不在WHERE条件的属性上使用函数或者表达式

SELECT id FROM t WHERE from date(day)>='2019-03-15' 会导致全表扫描。

正确的写法是:SELECT id FROM t WHERE day>= date('2019-03-15 00:00:00')

11)单表字段数建议小于30,单实例表数据建议小于500

过多的字段、表会导致数据库性能低下,并且难规范难控制。

12)Mysql单表数据尽量控制在500万以内

在mysql过大的数据会造成表修改结构,查询操作性能底下,而这个临界值最好控制在500万。

 

对于高并发应用,建议规则

1)一个表中,索引数量尽量控制在3个以内,最多不能超过5个。

索引不是越多越好,越多的索引导致数据库压力越大。合适合量地使用索引。

2)规避与合适地使用Join

有时候,在程序中处理Join比数据库中处理更快。

3)禁止使用外键,如果有外键完整性约束,需要应用程序控制

外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先。

4)尽量不要用自增长主键

不用自增长主键是因为当插入数据时,数据库首先会查询最大的索引值,然后再进行插入操作。所以,使用较短的string类型或者guid直接插入。

5)避免使用外键,如果有外键完整性约束,需要应用程序控制

外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先。

6)避免使用存储过程、视图、触发器、Event

使用存储过程等,在高并发场景下,数据库很容易CPU过高而崩毁。建议建立把耗CPU的移动到应用程序端,来达到更好扩展、控制的目的。

 

后续有遇到问题与建议时,慢慢加上其它的规则...

 

可以关注本人的公众号,多年经验的原创文章共享给大家。

原文地址:https://www.cnblogs.com/alunchen/p/11267988.html