yyblog2.0 数据库开发规范

一、基础规范

(1)必须使用InnoDB存储引擎

解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高

(2)表字符集默认使用utf8,必要时候使用utf8mb4

解读:1、通用,无乱码风险,汉字3字节,英文1字节。2、utf8mb4是utf8的超集,有存储4字节例如表情符号时,使用它

(3)数据表、数据字段必须加入中文注释

解读:N年后谁tm知道这个r1,r2,r3字段是干嘛的

(4)禁止使用存储过程、视图、触发器、Event

解读:1、对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层。2、调试,排错,迁移都比较困难,扩展性较差。

再划个重点,高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移吧。

(5)禁止存储大文件或者大照片

解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存URI多好

二、命名规范

(1)库名,表名,列名必须用小写,采用下划线分隔

解读:abc,Abc,ABC都是给自己埋坑

 (2)库名,表名,列名必须见名知义,长度不要超过32字符,禁止拼音英文混用

解读:tmp,wushan谁TM知道这些库是干嘛的

(3)表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

(4)SQL语句中关键字大写,并放在单独的行开始

三、表设计规范

(1)单实例表数目必须小于2000个

(2)单表列数目必须小于80个

(3)表必须有主键,推荐使用UNSIGNED整数,禁止使用字符串作为主键

解读:1、主键要选择较短的数据类型, Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率。2、 无主键的表删除,在row模式的主从架构,会导致备库夯住

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

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

(5)建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据

四、字段设计规范

(1)根据业务区分使用tinyint/int/bigint,分别会占用1/4/8字节

(2)根据业务区分使用char/varchar

解读:1、字段长度固定,或者长度近似的业务场景,适合使用char,能够减少碎片,查询性能高。2、字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间

(3)必须把字段定义为NOT NULL并设默认值

解读:1、NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化 2、NULL需要更多的存储空间 3、NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in时有大坑,参见我之前写的:mysql中不等于过滤null的问题

(4)禁止使用double存储货币,推荐decimal

解读:你就不担心钱对不上吗

(5)使用varchar(20)存储手机号,不要使用整数

解读:1、牵扯到国家代号,可能出现+/-/()等字符,例如+86。  2、手机号不会用来做数学运算。3、varchar可以模糊查询,例如like ‘138%’

五、索引设计规范

(1)单表索引建议控制在5个以内

(2)禁止在更新十分频繁、区分度不高的属性上建立索引

解读:1、更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能。2、“性别”这种区分度不大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似。一般来说,同值的数据超过表的百分之十五,那就没必要建索引了

(3)建立组合索引,必须把区分度高的字段放在前面

解读:理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)

六、SQL使用规范

(1)禁止使用SELECT *,只获取必要的字段

解读:1、读取不需要的列会增加cpu/io/内存/带宽的消耗。2、指定字段能有效利用索引覆盖。3、指定字段查询,在表结构变更时,能保证对应用程序无影响

(2)禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性

解读:容易在增加或者删除字段后出现程序BUG

(3)禁止使用属性隐式转换

解读:SELECT uid FROM t_user WHERE phone=13812345678 会导致全表扫描,而不能命中phone索引。这里应当对13812345678 加上单引号'13812345678 '。实际工作中类型字段的隐式转换是最多的,需要特别注意。

(4)禁止在WHERE条件列使用函数或者表达式

解读:导致不能命中索引,全表扫描。这个之前我使用的最多了。==!

SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15' 会导致全表扫描

正确的写法是:SELECT uid FROM t_user WHERE day>= unix_timestamp('2017-02-15 00:00:00')

(5)禁止负向查询,以及%开头的模糊查询

解读:1、负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描。2、%开头的模糊查询,会导致全表扫描,注意像'138%'也是会使用索引的。

(6)禁止大表使用JOIN查询,禁止大表使用子查询

解读:会产生临时表,消耗较多内存与CPU,极大影响数据库性能

(7)禁止使用OR条件,必须改为IN查询,IN的值必须少于50个

解读:旧版本Mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢?

(8)多表连接必须使用JOIN,LEFT JOIN,禁止使用FROM tab1,tab2

解读:都能实现关联查询,但是使用join更加灵活,效率更高。同时使用join会突出主表的存在,方便在mybaits等框架中快速定位sql位置。sql必须放在主表的xml中,便于重用。

结语:本规范将作为yyblog2.0数据库的开发要求,后续会不断更新。

yyblog1.0项目地址:https://github.com/allanzhuo/yyblog 欢迎star关注yyblog项目。

参考:架构师之路

转载于:https://www.cnblogs.com/laoyeye/p/9925449.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word2016 语法检查_如何改进Microsoft Word的语法检查器

word2016 语法检查Microsoft Word comes with a powerful grammar checker, but many of its advanced grammar detection features are disabled by default. Grammarly is popular, but you don’t need it to add grammar checking to Word. Word itself contains a free al…

linux服务器硬件监控,Linux服务器实时监控加载硬件信息

Linux服务器监控之实时监控加载硬件信息Linux负有盛名的特点之一是其非凡的稳定性。然而&#xff0c;如果您的硬件有缺陷或配置不正确&#xff0c;即使是世界上最稳定的操作系统也不会对您有什么帮助。计算机系统是由软件系统硬件系统组成的&#xff0c;检测硬件状态对于保障整…

Using Python with Oracle

2019独角兽企业重金招聘Python工程师标准>>> Using Python with Oracle This page discusses using Python with Oracle. The page is based on the cx_oracle Python extension module. It was developed on a VM running Oracle Enterprise Linux 6U4 runnng Orac…

小米oj 反向位整数(简单位运算)

反向位整数 序号&#xff1a;#30难度&#xff1a;一般时间限制&#xff1a;1000ms内存限制&#xff1a;10M 描述 输入32位无符号整数&#xff0c;输出它的反向位。 例&#xff0c;输入4626149&#xff08;以二进制表示为00000000010001101001011011100101&#xff09;&#xff…

如何在Microsoft Word中插入签名

Adding your signature to a Microsoft Word document is the ultimate way to personalize it as your own, especially for documents like letters or contracts. If you want to add a signature to a Word document, here’s how. 将签名添加到Microsoft Word文档是将其个…

linux 内核fpic,linux编译动态库 fPIC作用

标签&#xff1a;在生成动态库时&#xff0c;常常习惯性的加上fPIC选项&#xff0c;fPIC有什么作用和意义&#xff0c;加不加有什么区别&#xff0c;这里做下小结&#xff1a;fPIC的全称是 Position Independent Code&#xff0c; 用于生成位置无关代码。什么是位置无关代码&am…

jdk 1结尾和2结尾_“与巢一起工作”的结尾对您意味着什么

jdk 1结尾和2结尾korisbo/Shutterstock科里斯博/ ShutterstockGoogle announced the end of “Works With Nest” at Google I/O 2019. Many companies, from IFTTT to Philips Hue, use Works With Nest to automate your smarthome. Those automations will break soon. Goog…

spring-cloud:利用eureka实现服务提供与调用示例

1.运行环境 开发工具&#xff1a;intellij idea JDK版本&#xff1a;1.8 项目管理工具&#xff1a;Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCloud-learn-demo/tree/master/spring-cloud-eureka-producer-consumer

linux 桌面显示视频播放器,Ubuntu 13.10开启媒体播放器VLC桌面通知的步骤

VLC是一款多功能的媒体播放器&#xff0c;支持众多音频及视频格式&#xff0c;能够适用于Ubuntu等系统&#xff0c;而VLC播放器有桌面通知功能&#xff0c;需要手动开启&#xff0c;下面小编就以Ubuntu 13.10为例&#xff0c;给大家详细介绍下Ubuntu 13.10开启VLC桌面通知的步骤…

独家 | 蚂蚁金服TRaaS技术风险防控平台解密

小蚂蚁说&#xff1a; 在金融行业&#xff0c;风险防控能力的重要性不言而喻。而蚂蚁金服可实现高达99.999%的异地多活容灾&#xff0c;千亿级资金秒级实时核对“账、证、实”等能力也让业界有目共睹。 今年位于杭州的蚂蚁金服ATEC科技大会上&#xff0c;蚂蚁金服正式推出技术风…

谷歌表格_如何使用宏自动执行Google表格

谷歌表格Google Sheets lets you automate repetitive tasks with macros, and you can then bind them to keyboard shortcuts to execute them quickly. They work using Google Apps Script to capture your actions for later use. Google表格可以让您使用宏自动执行重复性…

阿里云弹性高性能计算E-HPC强势来袭,全新打造一站式云超算

为什么80%的码农都做不了架构师&#xff1f;>>> 摘要&#xff1a; 如今&#xff0c;高性能计算已在不知不觉中渗透到人类生活的方方面面。从材料科学到石油勘探、金融市场、应急管理、医学和互联网等领域&#xff0c;高性能计算无一不大显身手&#xff0c;帮助快速…

linux导出硬件信息,Linux 上生成硬件信息与配置报告: Sysreport

当需要 Linux 主机详细完整的描述给另一个人的时候&#xff0c;这个工具非常适合。用 root 用户之行&#xff0c;但要注意最好不要抓取 currently installed packages 信息&#xff0c;这一步非常慢。(用 -norpm 参数)存储厂商 EMC 也有个 EMCgrab 工具&#xff0c;工作原理类似…

深度优先搜索(DFS)----------------Tju_Oj_3517The longest athletic track

这个题主要考察对树的操作&#xff0c;主要思想是DFS或者BFS&#xff0c;其次是找树的直径方法&#xff08;既要运用两次BFS/DFS&#xff09;&#xff0c;最后作为小白&#xff0c;还练习了vector的操作。 DFS框架伪码: bool DSF(Node oneTreePoint ){ //传入的结点和其他有效…

word中图片超出页边距_如何在Word中更改页边距

word中图片超出页边距Word documents open with one-inch margins by default. You can adjust the page margins by choosing one of Word’s predefined options, or you can specify the exact height and width of the margins yourself. Here’s how. 默认情况下&#xff…

Android 中文 API (16) —— AnalogClock

一、结构 public class AnalogClock extends View java.lang.Object android.view.View android.widget.AnalogClock 二、类概述 这是一个带有时针和分针的模拟时钟控件。 三、受保护的方法 protected void onAttachedToWindow () 视图&#xff08;AnalogClock&#xff09;附在…

linux服务器探针软件,服务器安装ServerStatus监控探针教程

前言本文将介绍在服务器上安装ServerStatus来监控多台服务器的运行状态的教程.ServerStatus-Toyo版是一个酷炫高逼格的云探针、云监控、服务器云监控、多服务器探针~&#xff0c;该云监控(云探针)ServerStatus-Toyo项目链接本文为Stille原创文章.经实践,测试,整理发布.如需转载…

iphone播客怎么上传_如何在iPhone,iPad或Android上收听播客

iphone播客怎么上传Khamosh PathakKhamosh PathakDid someone recently recommend you listen to a podcast? If your response was, “What’s a podcast?” we’ve got the answer, and more! Here’s a crash course on podcasts and how you can listen to them on your …

NOIP2018 退役记

NOIP挂完&#xff0c;OI再见 AFO Day 0 早上的高铁&#xff0c;1点多到广州&#xff0c;2点多到酒店&#xff0c;下午就是颓颓颓&#xff0c;然后晚上随便刷了一下板子&#xff0c;反正PJ也没啥板子可以刷 就这样浪费了一天&#xff0c;我到底在干嘛 Day 1 早上心态很好的继续刷…

Linux决心书/李世超

Linux决心书大家好&#xff0c;我叫李世超&#xff0c;来自河北邯郸。今年24&#xff0c;感觉之前的生活状态不是自己想要的&#xff0c;每天浑浑噩噩。我觉得人要对自己定一个目标&#xff0c;我的目标就是月薪10K以上&#xff0c;所以我要努力在老男孩教育学习技术。珍惜这五…