加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

分享一份大佬的MySQL数据库计划类型,值得保藏

发布时间:2019-10-15 09:28:03 所属栏目:编程 来源:波波说运维
导读:MySQL数据库与 Oracle、 SQL Server 等数据库对比,有其内核上的上风与劣势。我们在行使MySQL数据库的时辰必要遵循必然类型,扬长避短。有时中从github上看到一个大佬的MySQL数据库计划类型,趁便在这里分享一下。 https://github.com/jly8866/archer/blob
副问题[/!--empirenews.page--]

MySQL数据库与 Oracle、 SQL Server 等数据库对比,有其内核上的上风与劣势。我们在行使MySQL数据库的时辰必要遵循必然类型,扬长避短。有时中从github上看到一个大佬的MySQL数据库计划类型,趁便在这里分享一下。

https://github.com/jly8866/archer/blob/master/src/docs/mysql_db_design_guide.md

写的都很适用,提议保藏阅读。

分享一份大佬的MySQL数据库计划类型,值得保藏

一、数据库计划

以下全部类型会凭证【高危】、【逼迫】、【提议】三个级别举办标注,遵守优先级从高到低。对付不满意【高危】和【逼迫】两个级此外计划,DBA会逼迫打回要求修改。

1. 库名

  • 【逼迫】库的名称必需节制在32个字符以内,相干模块的表名与表名之间只管提现join的相关,如user表和user_login表。
  • 【逼迫】库的名称名目:营业体系名称_子体系名,统一模块行使的表名只管行使同一前缀。
  • 【逼迫】一样平常分库名称定名名目是库通配名_编号,编号从0开始递增,好比wenda_001以时刻举办分库的名称名目是“库通配名_时刻”
  • 【逼迫】建设数据库时必需显式指定字符集,而且字符集只能是utf8可能utf8mb4。建设数据库SQL举例:create database db1 default character set utf8;。

2. 表布局

  • 【逼迫】表和列的名称必需节制在32个字符以内,表名只能行使字母、数字和下划线,一致小写。
  • 【逼迫】表名要求模块名强相干,如师资体系回收”sz”作为前缀,渠道体系回收”qd”作为前缀等。
  • 【逼迫】建设表时必需显式指定字符集为utf8或utf8mb4。
  • 【逼迫】建设表时必需显式指定表存储引擎范例,如无非凡需求,一致为InnoDB。当必要行使除InnoDB/MyISAM/Memory以外的存储引擎时,必需通过DBA考核才气在出产情形中行使。由于Innodb表支持事宜、行锁、宕机规复、MVCC等相关型数据库重要特征,为业界行使最多的MySQL存储引擎。而这是其他大大都存储引擎不具备的,因此首推InnoDB。
  • 【逼迫】建表必需有comment
  • 【提议】建表时关于主键:(1)逼迫要求主键为id,范例为int或bigint,且为auto_increment(2)标识内外每一行主体的字段不要设为主键,提议设为其他字段如user_id,order_id等,并成立unique key索引(可参考cdb.teacher表计划)。由于假如设为主键且主键值为随机插入,则会导致innodb内部page破碎和大量随机I/O,机能降落。
  • 【提议】焦点表(如用户表,款子相干的表)必需有行数据的建设时刻字段create_time和最后更新时刻字段update_time,便于盘查题。
  • 【提议】表中全部字段必需都是NOT NULL属性,营业可以按照必要界说DEFAULT值。由于行使NULL值会存在每一行城市占用特殊存储空间、数据迁徙轻易堕落、聚合函数计较功效毛病等题目。
  • 【提议】提议对内外的blob、text等大字段,垂直拆分到其他内外,仅在必要读这些工具的时辰才去select。
  • 【提议】反范式计划:把常常必要join查询的字段,在其他内外冗余一份。如user_name属性在user_account,user_login_log等内外冗余一份,镌汰join查询。
  • 【逼迫】中间表用于保存中间功效集,名称必需以tmp_开头。备份表用于备份或抓取源表快照,名称必需以bak_开头。中间表和备份表按期整理。
  • 【逼迫】对付高出100W行的大表举办alter table,必需颠末DBA考核,并在营业低峰期执行。由于alter table会发生表锁,时代阻塞对付该表的全部写入,对付营业也许会发生极大影响。

3. 列数据范例优化

  • 【提议】表中的自增列(auto_increment属性),保举行使bigint范例。由于无标记int存储范畴为-2147483648~2147483647(约莫21亿阁下),溢出后会导致报错。
  • 【提议】营业中选择性很少的状态status、范例type等字段保举行使tinytint可能smallint范例节减存储空间。
  • 【提议】营业中IP地点字段保举行使int范例,不保举用char(15)。由于int只占4字节,可以用如下函数彼此转换,而char(15)占用至少15字节。一旦表数据行数到了1亿,那么要多用1.1G存储空间。 SQL:select inet_aton('192.168.2.12'); select inet_ntoa(3232236044); PHP: ip2long(‘192.168.2.12’); long2ip(3530427185);
  • 【提议】不保举行使enum,set。 由于它们挥霍空间,且列举值写死了,改观不利便。保举行使tinyint或smallint。
  • 【提议】不保举行使blob,text等范例。它们都较量挥霍硬盘和内存空间。在加载表数据时,会读取大字段到内存里从而挥霍内存空间,影响体系机能。提媾和PM、RD雷同,是否真的必要这么大字段。Innodb中当一行记录高出8098字节时,会将该记录中选取最长的一个字段将其768字节放在原始page里,该字段余下内容放在overflow-page里。不幸的是在compact行名目下,原始page和overflow-page城市加载。
  • 【提议】存储款子的字段,提议用int,措施端乘以100和除以100举办存取。由于int占用4字节,而double占用8字节,空间挥霍。
  • 【提议】文本数据只管用varchar存储。由于varchar是变长存储,比char更省空间。MySQL server层划定一行全部文本最多存65535字节,因此在utf8字符集下最多存21844个字符,高出会自动转换为mediumtext字段。而text在utf8字符集下最多存21844个字符,mediumtext最多存2^24/3个字符,longtext最多存2^32个字符。一样平常提议用varchar范例,字符数不要高出2700。
  • 【提议】时刻范例只管选取timestamp。由于datetime占用8字节,timestamp仅占用4字节,可是范畴为1970-01-01 00:00:01到2038-01-01 00:00:00。更为高阶的要领,选用int来存储时刻,行使SQL函数unix_timestamp()和from_unixtime()来举办转换。

具体存储巨细介入下图:

分享一份大佬的MySQL数据库计划类型,值得保藏

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读