博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库系列(二)之 开发规则与优化
阅读量:5031 次
发布时间:2019-06-12

本文共 2122 字,大约阅读时间需要 7 分钟。

前言

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

对于所有应用,建议规则

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的移动到应用程序端,来达到更好扩展、控制的目的。

 

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

 

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

posted on
2019-07-30 09:23  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/alunchen/p/11267988.html

你可能感兴趣的文章
背包格子的物品交换加移动的实现
查看>>
dhroid - NetJSONAdapter 网络化的adapter
查看>>
CSS创建三角形(小三角)的几种方法 (转)
查看>>
字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
查看>>
java时间工具类
查看>>
gdutcode 1195: 相信我这是水题 GDUT中有个风云人物pigofzhou,是冰点奇迹队的主代码手,...
查看>>
Android抓包方法(二)之Tcpdump命令+Wireshark
查看>>
最近几天玩freebsd奋斗成果总结
查看>>
管理员登陆界面与数据库操作界面设计
查看>>
Centos 6.4 安装mysql-5.6.14-linux-glibc2.5-i686.tar.gz
查看>>
Eclipse中对一个项目进行复制粘贴为一个新项目
查看>>
Python学习杂记_15_正则表达式
查看>>
Cheatsheet: 2013 09.10 ~ 09.21
查看>>
springboot 热部署 idea版本(转)
查看>>
Android必知必会-带列表的地图POI周边搜索
查看>>
AJAX技术解读
查看>>
第三方分享(新浪,微信,QQ)
查看>>
css规范
查看>>
移动端IM系统的协议选型:UDP还是TCP?
查看>>
poj3090 Visible Lattice Points
查看>>