架构师必备技能之——MySQL数据库表设计
Posted supingemail
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了架构师必备技能之——MySQL数据库表设计相关的知识,希望对你有一定的参考价值。
好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.
目录
一、总体设计思想
1.不要在数据库做运算符操作
数据库服务器资源宝贵,要特别珍惜利用,如果在数据库上做如rand(),md5()等操作,在并发下对服务器很有压力,让数据库多做她擅长的事:尽量不在数据库做运算,复杂运算秱到程序端CPU,尽可能简单应用mysql。
2.合理控制数据库表的数据量
单库不要超过300张表;单表的数据量不要超过5000W。如果要达到较好的体验,数值INT型的,不要超过1000W,字符型的不要超过500W。当数据量超过一定量时候,需要考虑分表,分库操作。
3.控制好表的列数
单表字段数上限控制在40个以内,超过的部分,可以考虑附表或者放入其他的表中。列数过多,在insert 数据的时候,就会慢,get的时候,也会慢。
4.三范式和冗余共存
并不是每个表的列信息都必须按照三范式来,而是效率优先、提升性能,没有绝对的对与错,适当时牺牲范式、加入冗余。
5.拒绝三大设置
大SQL (BIG SQL);大事务 (BIG Transaction);大批量 (BIG Batch);任何的一大,在并发场景下,都可能拖慢服务,甚至让数据库服务器dang掉。
二、字段相关设计原则
1.用好数值字段类型
使用好INT类型:TINYINT(1Byte)、SMALLINT(2B)、MEDIUMINT(3B)、INT(4B)、BIGINT(8B);使用好浮点型:FLOAT(4B)、DOUBLE(8B);金融类型:DECIMAL(M,D)
2.将字符串转换成数字
数字类型比字符串类型索引的有点是:1、更高效;2、查询更快;3、占用空间更小;例如存储用IP用数字而不用字符串。
3.优先使用枚举(ENUM)和集合(SET)
例如:`sex` enum('F','M') COMMENT '性别';`status` enum('0','1','2','3') COMMENT '账户状态';
4.避免使用NULL做为字段的默认值
如果使用NULL作为字段的默认值,会导致的情况是:1、很难进行查询优化;2、NULL列加索引,需要额外空间;3、含NULL复合索引无效;
5.少用并拆分TEXT/BLOB/LONGTEXT
1、TEXT类型处理性能远低亍VARCHAR;2、强制生成硬盘临时表;3、浪费更多空间;4、VARCHAR(65535)==>64K (注意UTF-8);
总结:尽量不要用TEXT/BLOB/LONGTEX数据类型,若必须使用则拆分到单独的表。
6.不要在数据库里存储图片
存储图片路径,而不是将图片BASE64进行流式存储。
三、索引设计原则
1.谨慎合理的添加索引
索引的优点是:提高响应时间,改善查询速度;缺点是:更新操作缓慢,添加操作缓慢;原则:索引适可而止,不是越多越好,核心查询字段应该加索引
2.字符字段应该建立前缀索引
`order_no` varchar(100) NOT NULL COMMENT '订单编号', //order20220501000000001
KEY `idx_order_no` (`order_no`(5)),
3.不要在索引列做运算
索引列上做的运算会导致:1、索引失效; 2、全表扫描
4.自增列或全局ID做INNODB主键
用独立于业务的AUTO_INCREMENT列或全局ID生成器做代理主键,若不指定主键,InnoDB会用唯一且非空值索引代替。
5.尽量不使用外键
外键的优点是:外键可节省开发量;可锁其他表;缺点是:高并发时候容易死锁;最好的方案是在程序中保证主外键约束。
四、SQL操作原则
1.SQL语句尽可能的简单
Simple is beauty!越是简单的SQL语句,越容易操作。一条SQL语句只能在一个CPU中运算,所以巨型SQL极有可能将整个数据库服务器堵死;
应对方案:将大SQL拆解成若干小SQL,在程序内存中完成数据集的生成。
2.保持事务连接最小
要保持事务/数据连接短小精悍:事务/连接即开即用,用完即关。事务只处理事务相关操作,无关操作放在事务之外操作。
3.尽可能少的使用存储过程,触发器,功能函数
存储过程、触发器等的使用,都是建立在数据库服务器的CPU上进行的,在并发量上来的时候,会将数据库拖垮、宕机。
4.不要使用SELECT *
select * 的操作会更多消耗CPU、内存、IO、网络带宽等资源,需要什么数据就提取什么数据。
5.改OR为IN 操作
注意在 IN 操作时候, IN 控制的值在 200个以内.
6.改OR为UNION 操作
UNION操作获取数据合集更利于使用数据库的特性。
7.避免负向查询和% 前缀模糊查询
避免负向查询:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等;
避免 % 前缀模糊查询:B+ Tree使用不了索引,导致全表扫描;
8.减少COUNT(*)操作
COUNT(*)的资源开销大,尽量不用少用;
9.使用 LIMIT 实现高效分页
Select order_no,user_id from table WHERE id>=100000 limit 10;
10.用UNION ALL 而非 UNION
若无需对结果进行去重,则用UNION ALL,UNION有去重开销
11.分解联接保证高并发(最多可以进行三张表以内的关联查询)
高幵发DB不建议进行两个表以上的JOIN
五、其他原则
1.数据库编码都设置成utf8mb4
2.统一的命名规范,如索引用“idx_xxxxx”
3.注意避免用保留字命名
还有些其他的设计原则,但最主要的,还是都是上面这些。
以上是关于架构师必备技能之——MySQL数据库表设计的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-102]:《软件架构设计:程序员向架构师转型必备》-12-粗粒度“软件架构的功能模块”划分,架构师必备基础技能