300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 架构师必备技能之——MySQL数据库表设计

架构师必备技能之——MySQL数据库表设计

时间:2021-07-16 21:57:32

相关推荐

架构师必备技能之——MySQL数据库表设计

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.

目录

一、总体设计思想

二、字段相关设计原则

三、索引设计原则

四、SQL操作原则

五、其他原则

一、总体设计思想

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 '订单编号', //order0501000000001

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.注意避免用保留字命名

还有些其他的设计原则,但最主要的,还是都是上面这些。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。