分类 知识 下的文章

CTO 要我把这份 MySQL 规范贴在工位上!

因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本。

规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建表语句、错误 SQL、错误的索引有积极的意义,故分享出来给大家参考。

下边分为建表规约、SQL 规约、索引规约三个部分,每部分的每一条都有强制、建议两个级别,大家在参考时,根据自己公司的情况来权衡。


建表规约

【强制】: ① 存储引擎必须使用 InnoDB

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

【强制】:②每张表必须设置一个主键 ID,且这个主键 ID 使用自增主键(在满足需要的情况下尽量短),除非在分库分表环境下

解读: 由于 InnoDB 组织数据的方式决定了需要有一个主键,而且若是这个主键 ID 是单调递增的可以有效提高插入的性能,避免过多的页分裂、减少表碎片提高空间的使用率。

而在分库分表环境下,则需要统一来分配各个表中的主键值,从而避免整个逻辑表中主键重复。

【强制】:③必须使用 utf8mb4 字符集

解读: 在 MySQL 中的 UTF-8 并非“真正的 UTF-8”,而 utf8mb4”才是真正的“UTF-8”。

【强制】:④数据库表、表字段必须加入中文注释

解读: 大家都别懒。

【强制】:⑤库名、表名、字段名均小写,下划线风格,不超过 32 个字符,必须见名知意,禁止拼音英文混用

解读:约定。

【强制】:⑥单表列数目必须小于 30,若超过则应该考虑将表拆分

解读: 单表列数太多使得 MySQL 服务器处理 InnoDB 返回数据之间的映射成本太高。

【强制】:⑦禁止使用外键,如果有外键完整性约束,需要应用程序控制

解读: 外键会导致表与表之间耦合,UPDATE 与 DELETE 操作都会涉及相关联的表,十分影响 SQL 的性能,甚至会造成死锁。

【强制】:⑧必须把字段定义为 NOT NULL 并且提供默认值

解读:

NULL 的列使索引/索引统计/值比较都更加复杂,对 MySQL 来说更难优化。
NULL 这种类型 MySQL 内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多。
NULL 值需要更多的存储空,无论是表还是索引中每行中的 NULL 的列都需要额外的空间来标识。

【强制】:⑨禁用保留字,如 DESC、RANGE、MARCH 等

解读: 请参考 MySQL 官方保留字。

【强制】:⑩如果存储的字符串长度几乎相等,使用 CHAR 定长字符串类型

解读:能够减少空间碎片,节省存储空间。

【建议】: ⑪ 在一些场景下,考虑使用 TIMESTAMP 代替 DATETIME

解读:

这两种类型的都能表达"yyyy-MM-dd HH:mm:ss"格式的时间,TIMESTAMP 只需要占用 4 个字节的长度,可以存储的范围为(1970-2038)年,在各个时区,所展示的时间是不一样的。
而 DATETIME 类型占用 8 个字节,对时区不敏感,可以存储的范围为(1001-9999)年。

【建议】:⑫当心自动生成的 Schema,建议所有的 Schema 手动编写

解读: 对于一些数据库客户端不要太过信任。


SQL 规约

【建议】:①为了充分利用缓存,不允许使用自定义函数、存储函数、用户变量

解读:如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果都不会被缓存。

比如函数 NOW() 或者 CURRENT_DATE() 会因为不同的查询时间,返回不同的查询结果。

【强制】:②在查询中指定所需的列,而不是直接使用“ *”返回所有的列

解读:

读取不需要的列会增加 CPU、IO、NET 消耗。
不能有效的利用覆盖索引。

【强制】:③不允许使用属性隐式转换

解读: 假设我们在手机号列上添加了索引,然后执行下面的 SQL 会发生什么?

explain SELECT user_name FROM parent WHERE phone=13812345678;很明显就是索引不生效,会全表扫描。

【建议】:④在 WHERE 条件的属性上使用函数或者表达式

解读: MySQL 无法自动解析这种表达式,无法使用到索引。

【强制】: ⑤禁止使用外键与级联,一切外键概念必须在应用层解决

解读: 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

【建议】:⑥应尽量避免在 WHERE 子句中使用 or 作为连接条件

解读: 根据情况可以选择使用 UNION ALL 来代替 OR。

【强制】:⑦不允许使用 % 开头的模糊查询

解读: 根据索引的最左前缀原理,%开头的模糊查询无法使用索引,可以使用 ES 来做检索。

索引规约

【建议】:①避免在更新比较频繁、区分度不高的列上单独建立索引

解读: 区分度不高的列单独创建索引的优化效果很小,但是较为频繁的更新则会让索引的维护成本更高。

【强制】:②JOIN 的表不允许超过五个。需要 JOIN 的字段,数据类型必须绝对一致; 多表关联查询时,保证被关联的字段需要有索引

解读: 太多表的 JOIN 会让 MySQL 的优化器更难权衡出一个“最佳”的执行计划(可能性为表数量的阶乘),同时要注意关联字段的类型、长度、字符编码等等是否一致。

【强制】:③在一个联合索引中,若第一列索引区分度等于 1,那么则不需要建立联合索引

解读: 索引通过第一列就能够完全定位的数据,所以联合索引的后边部分是不需要的。

【强制】:④建立联合索引时,必须将区分度更高的字段放在左边

解读: 区分度更高的列放在左边,能够在一开始就有效的过滤掉无用数据。提高索引的效率,相应我们在 Mapper 中编写 SQL 的 WHERE 条件中有多个条件时,需要先看看当前表是否有现成的联合索引直接使用,注意各个条件的顺序尽量和索引的顺序一致。

【建议】:⑤利用覆盖索引来进行查询操作,避免回表

解读: 覆盖查询即是查询只需要通过索引即可拿到所需 DATA,而不再需要再次回表查询,所以效率相对很高。

我们在使用 EXPLAIN 的结果,extra 列会出现:"using index"。这里也要强调一下不要使用“SELECT * ”,否则几乎不可能使用到覆盖索引。

【建议】:⑥在较长 VARCHAR 字段,例如 VARCHAR(100) 上建立索引时,应指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可

解读: 索引的长度与区分度是一对矛盾体,一般对字符串类型数据,若长度为 20 的索引,区分度会高达 90% 以上,则可以考虑创建长度例为 20 的索引,而非全字段索引。

例如可以使用 SELECT COUNT(DISTINCT LEFT(lesson_code, 20))/COUNT(*) FROM lesson;来确定 lesson_code 字段字符长度为 20 时文本区分度。

【建议】:⑦如果有 ORDER BY 的场景,请注意利用索引的有序性

ORDER BY 最后的字段是联合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。

解读:

假设有查询条件为 WHERE a=? and b=? ORDER BY c;存在索引:a_b_c,则此时可以利用索引排序。
反例:在查询条件中包含了范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b;索引 a_b 无法排序。

【建议】:⑧在 Where 中索引的列不能某个表达式的一部分,也不能是函数的参数

解读: 即是某列上已经添加了索引,但是若此列成为表达式的一部分、或者是函数的参数,MySQL 无法将此列单独解析出来,索引也不会生效。

【建议】:⑨我们在 Where 条件中使用范围查询时,索引最多用于一个范围条件,超过一个则后边的不走索引

解读: MySQL 能够使用多个范围条件里边的最左边的第一个范围查询,但是后边的范围查询则无法使用。

【建议】:⑩在多个表进行外连接时,表之间的关联字段类型必须完全一致

解读: 当两个表进行 Join 时,字段类型若没有完全一致,则加索引也不会生效,这里的完全一致包括但不限于字段类型、字段长度、字符集、Collection 等等。

2018最新中国私有云企业TOP20榜单

临近年底,各大权威调研咨询机构报告将陆续出炉。刚刚,由工信部电子一所指导,计世资讯(CCW Research)发布了《2017-2018年度中国私有云市场现状与发展趋势研究报告》,成为今年首份中国私有云市场报告。

临近年底,各大权威调研咨询机构报告将陆续出炉。刚刚,由工信部电子一所指导,计世资讯(CCW Research)发布了《2017-2018年度中国私有云市场现状与发展趋势研究报告》,成为今年首份中国私有云市场报告。其中,不仅有大量一手调研数据,观点与预测,趋势与判断,以及中国私有云市场品牌竞争力分析象限,最抓人眼球的当属中国私有云企业TOP20榜单,这也是2018年首发的第一份专业的私有云企业排行榜。

一,私有云市场高速增长

根据计世资讯的研究调查结果,中国私有云市场将继续保持高速增长的趋势,预计2018年市场规模将达到512.4亿元,同比增长27.0%。且到2022年,预计中国私有云市场规模将达到近1000亿元。随着政务云、制造业、金融云等私有云市场(三大行业市场占据超过60%市场份额)的活跃,以及各地政府推动企业上云计划的实施,为中国私有云市场的发展提供了坚实的基础。

1

2017~2018年私有云市场规模及增长

计世资讯研究表明,预计2018年中国私有云市场中硬件市场份额为66.5%,硬件下降幅度有加速的趋势。软件和服务则呈现快速上升的趋势,预计2018年市场份额分别将达到21.2%和12.3%。硬件产品在私有云解决方案中的重要性持续下降,并且随着超融合的产品的快速落地,使得项目中硬件产品的采购规模大幅降低。另一方面,软件和服务产品的重要性越发凸显,已经成为了私有云解决方案中的核心,成为了决定私有云项目成功与否的关键。

二,私有云企业竞争力分析象限

中国私有云需求旺盛,因而成为各类企业竞争的重点。依照惯例,计世资讯发布了“2018年私有云市场品牌竞争力分析象限图”,其中,最值得关注的领导者象限包括:华为、新华三、VMware、华云、EasyStack(易捷行云)五家企业。

2

2017-2018年私有云市场各品牌竞争力分析象限

与去年竞争力分析象限中的领导者象限相比,有几点值得关注:

1、VMware是唯一一家国外企业,也是唯一进入领导者象限的非OpenStack企业。

VMware虚拟化可谓市场接受程度最高,那么中国用户对VMware产品应用是否还停留在虚拟化阶段呢?“VMware作为虚拟化巨头近年来在国内保持了良好的发展势头,服务器虚拟化产品市场份额远超其他对手。”计世资讯点评也印证了这一点:“但是在私有云方面,VMware的占有率似乎并不高。我们认为这主要源于用户管理需求的复杂化导致用户需要更开放更具有兼容性的产品,比如OpenStack+KVM的产品。”

同时,计世资讯也给出了VMware建议:“当然不可否认VMware在产品特性和功能方面依然有独到的地方,VMware仍然是私有云中的举足轻重领导者。但与国内用户使用特性的结合方面仍有待提升。对应用户的定制化需求往往是私有云方案赢得市场的关键,这方面VMware正在着手改善。”

2、EasyStack是唯一进入领导者象限的云创业型企业,专业私有云厂商。

EasyStack成立四年以来在中国私有云市场上声音不断,四年获得五轮融资,已到C++轮阶段。应该说,对于云创业型企业首要比拼的就是技术能力和产品能力,才能在强手林立的私有云市场迅速占据一席之地。“EasyStack一直受到资本市场青睐,也是为数不多的在Linux、OpenStack、Ceph、Kubernetes、Docker等开源云技术领域均有涉足的企业。”计世资讯对EasyStack的点评也强调了这一点,“EasyStack强调产品化能力,在稳定性、可靠性和性能上要求较高的金融行业,以及业务场景复杂、IoT等创新应用颇多的制造行业取得了不少标杆客户和较大市场份额。”

同时,计世资讯对EasyStack另一点评价也值得关注:“EasyStack也注重用户体验,在ECS企业云纯软件的基础上推出了云计算的软硬一体化交付产品ECS Stack超融合,扩大了市场受众。”

这符合计世资讯对于中国私有云市场的一个重要判断——现阶段按照License交付模式更多的是随着超融合等硬件设备一同交付,云软硬一体化交付正在成为私有云市场的新趋势。云软硬一体化交付模式将会大幅简化私有云的部署周期,有效减少厂商的定制化工作,推动私有云产品化落地,对市场起到强劲的推动作用。

此外,华为、新华三继续以传统IT企业身份占据领导者象限,且以国内为数不多的能够覆盖从硬件到软件再到解决方案,拥有全线云产品的特色,都在政务云方面表现突出。华云则以公有云企业身份新入领导者象限,计世资讯认为全云能力是华云最大的特点和优势。

三,OpenStack是中国私有云的事实标准

以OpenStack为代表的开源技术依然在私有云市场中占据主流。计世资讯认为,作为全球部署最广泛的开源云基础设施软件,OpenStack经过8年的发展,在国内已经形成了稳定的以OpenStack为核心的开源云生态体系。尽管OpenStack在近年来受到了容器等技术的冲击,但是在中国市场中越来越丰富、越来越成熟的用户实践案例表明,OpenStack开源云技术依然保持着足够的活力。现在OpenStack发展已经越发成熟,已逐渐摆脱了最初的版本混乱,后续运营维护、改造升级成本高昂等问题。

不仅5家领导者象限企业中就有4家(华为、新华三、华云、EasyStack)以OpenStack为基础,在排名TOP20的私有云企业当中开源与闭源技术应用比例也高达7:3。在企业用户调查中也反应了这一点,被调查的283家企业用户当中,私有云建设中开源软件和闭源软件的采用百分比分别为82.4%和17.6%。

3

2018年中国私有云TOP20厂商中开源和闭源技术应用比例

四,私有云企业TOP20大排名

计世资讯《2017-2018年度中国私有云市场现状与发展趋势研究报告》同时还发布了“2018中国私有云解决方案提供商TOP20”榜单:

4

中国私有云解决方案提供商TOP20

如果将竞争力象限中的企业进行排序,计世资讯给出的中国市场私有云TOP20榜单是这样的。你怎么看?

5

计世资讯报告中提到,按照类别来看,公有云厂商、传统IT厂商、电信运营商、系统集成商、云创业型公司五大类企业都已经深度参与到了私有云市场的竞争之中(具体代表企业如上)。可见,云计算经过超过10年的发展,重点已经从公有云市场转向行业企业市场挖潜,私有云已经成为云计算下半场的重要焦点。

/* * @Author: your name * @Date: 2016-09-06 00:00:00 * @LastEditTime: 2020-03-17 18:29:35 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \htdocs\usr\themes\default\footer.php */