MYSQL开发规范

合集下载

MySQL数据库设计规范(仅供参考)

MySQL数据库设计规范(仅供参考)

MySQL数据库设计规范(仅供参考)MySQL数据库设计规范(仅供参考)⽬录1. 规范背景与⽬的2. 设计规范2.1 数据库设计2.1.1 库名2.1.2 表结构2.1.3 列数据类型优化2.1.4 索引设计2.1.5 分库分表、分区表2.1.6 字符集2.1.7 程序DAO层设计建议2.1.8 ⼀个规范的建表语句⽰例2.2 SQL编写2.2.1 DML语句2.2.2 多表连接2.2.3 事务2.2.4 排序和分组2.2.5 线上禁⽌使⽤的SQL语句1. 规范背景与⽬的MySQL数据库与 Oracle、 SQL Server 等数据库相⽐,有其内核上的优势与劣势。

我们在使⽤MySQL数据库的时候需要遵循⼀定规范,扬长避短。

本规范旨在帮助或指导RD、QA、OP等技术⼈员做出适合线上业务的数据库设计。

在数据库变更和处理流程、数据库表设计、SQL编写等⽅⾯予以规范,从⽽为公司业务系统稳定、健康地运⾏提供保障。

2. 设计规范2.1 数据库设计以下所有规范会按照【⾼危】、【强制】、【建议】三个级别进⾏标注,遵守优先级从⾼到低。

对于不满⾜【⾼危】和【强制】两个级别的设计,DBA会强制打回要求修改。

2.1.1 库名1. 【强制】库的名称必须控制在32个字符以内,相关模块的表名与表名之间尽量提现join的关系,如user表和user_login表。

2. 【强制】库的名称格式:业务系统名称_⼦系统名,同⼀模块使⽤的表名尽量使⽤统⼀前缀。

3. 【强制】⼀般分库名称命名格式是库通配名_编号,编号从0开始递增,⽐如wenda_001以时间进⾏分库的名称格式是“库通配名_时间”4. 【强制】创建数据库时必须显式指定字符集,并且字符集只能是utf8或者utf8mb4。

创建数据库SQL举例:create database db1 defaultcharacter set utf8;。

2.1.2 表结构1. 【强制】表和列的名称必须控制在32个字符以内,表名只能使⽤字母、数字和下划线,⼀律⼩写。

MySQL的数据库设计原则和规范

MySQL的数据库设计原则和规范

MySQL的数据库设计原则和规范随着互联网的快速发展,大量的数据被生成并储存在数据库中。

作为一种开源关系型数据库管理系统,MySQL因其高性能、可靠性和易用性而受到广泛的使用和认可。

在进行MySQL数据库设计时,遵循一些设计原则和规范可以帮助提高数据库的效率和可维护性。

本文将介绍一些MySQL数据库设计的原则和规范,以帮助开发人员更好地进行数据库设计。

一、表的设计1. 表的字段命名字段命名应该具有明确的含义,并遵循一定的命名规则。

通常,字段名应以小写字母开头,并使用下划线(_)或驼峰命名法(如camelCase)作为单词间的分隔符。

避免使用保留字作为字段名。

例如,一个表示用户姓名的字段可以被命名为“user_name”。

2. 主键的设计每个表都应该有一个主键用于唯一标识表中的每一行数据。

通常情况下,自增长的整数类型(如INT)被用作主键。

主键的命名应该使用表名加上“_id”的后缀,如“user_id”。

3. 字段的数据类型选择在选择字段的数据类型时,应该根据实际需求选择最适合的数据类型。

例如,使用INT代替VARCHAR来存储一个数字字段,可以提高查询效率和节省存储空间。

4. 字段的约束在创建表时,通过添加合适的约束来保证数据的完整性和一致性。

例如,可以使用NOT NULL约束来确保字段的值不能为空,使用UNIQUE约束来确保某个字段的值在表中是唯一的。

二、索引的设计索引对于提高查询性能和加快数据检索速度至关重要。

以下是一些关于索引设计的原则和规范:1. 表的主键字段应该被索引主键字段被用作唯一标识表中的每一行数据,因此应该被索引以提高查询效率和数据检索速度。

2. 经常用于WHERE子句的字段应该被索引字段在WHERE子句中的使用频率高,应该被索引以加快数据检索速度。

例如,一个经常用于查询的用户ID字段应该被索引。

3. 不要过度索引虽然索引可以提高查询性能,但过多的索引会增加数据库的维护成本和写操作的负担。

mysql数据库规范

mysql数据库规范
MySQL数据库使用规范涉及多个方面。首先,推荐使用InnoDB存储引擎,因其支持事务、行级锁,并发性能好,资源利用率高。新库应采用utf8mb4字符集,避免乱码风险。数据库表及字段需加中文注释,以提高可读性。规范中禁止使用存储过程、视图、触发器和Event,以减轻数据库负担。同时,禁止在数据库中存储大文件或照片。对于线上、开发、测试环境的数据库命名,也有明确的约定。在表结构设计上,要求表名、字段名小写、下划线风格,且必须直观易懂。单实例表数不得超过500,单表列数小于30,且表必须有主键。字段设计方面,禁止使用外键,字段应定义为NOቤተ መጻሕፍቲ ባይዱ NULL并提供默认值,避免使用TEXT和BLOB类型以节省空间和提高性能。对于货币,应使用整数而非小数存储。此外,还有关于索引设计和SQL编写的详细规范,如单表索引建议控制在5个以内,避免在频繁更新、低区分度的属性上建索引,以及编写SQL时的具体注意事项。最后,行为规范部分强调了环境隔离、避免隐式属性转换等要求,以确保数据库的安全和稳定。

MySQL建表的规范总结

MySQL建表的规范总结

Mysql建表与索引使用规范整理一,设计表规范:1. MySQL建表,字段需设置为非空,需设置字段默认值。

2. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

3. MySQL建表,如果字段等价于外键,应在该字段加索引。

4. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

5. MySQL使用时,一条SQL语句只能使用一个表的一个索引。

所有的字段类型都可以索引,多列索引的属性最多15个。

6. 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。

7. 建立索引index(part1,part2,part3),相当于建立了index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。

8. MySQL针对like语法必须如下格式才使用索引:SELECT * FROM t1 WHERE key_col LIKE ‘ab%’ ;9. SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECTCOUNT(col_name)快,但是在有where条件的语句中执行效率要快。

10. 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。

各自单一索引的话,只使用遍历最少行的那个索引。

11. 在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

12. ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

13. 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

14.、JOIN 索引,所有匹配ON和where的字段应建立合适的索引。

15. 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

mysql 数据库设计规约 概述及解释说明

mysql 数据库设计规约 概述及解释说明

mysql 数据库设计规约概述及解释说明1. 引言1.1 概述在现代信息化的社会背景下,数据库成为了各个行业中不可或缺的重要组成部分。

而数据库的设计规范则是确保数据库系统高效、可靠运行的基础。

MySQL作为目前最流行的关系型数据库管理系统之一,其设计规约对于保证数据的完整性和一致性至关重要。

本文将对MySQL数据库设计规约进行深入解释和说明,旨在提供给读者一个全面了解MySQL数据库设计规范及其重要性的视角。

1.2 文章结构本文将从以下几个方面进行详细阐述:引言、数据库设计规约解释说明、MySQL 数据库基础知识回顾、创建数据库和表格时应遵循的规范以及设计数据库关系时应遵循的规范。

通过这些内容,读者可以全面了解到MySQL数据库设计规约相关的核心概念和实践经验。

1.3 目的本文的目标可以总结为以下几点:首先,介绍和解释什么是MySQL数据库设计规约以及它们对于构建高度可管理和可扩展的数据库系统所起到的作用。

其次,回顾MySQL数据库的基础知识,包括它的特点、优势以及基本组成与架构。

这样可以为读者提供一个全面的背景,以便更好地理解如何使用数据库设计规范。

接着,讨论在创建数据库和表格时应遵循的规范。

这包括数据库、表格和字段命名规范以及注意事项。

通过明确这些规范,可以保证数据库在整个开发过程中的一致性和稳定性。

最后,探讨设计数据库关系时应遵循的规范。

主要包括主键、外键和索引设计原则、建立表格之间的关系以及范式理论在数据库设计中的应用。

这些规范将帮助读者优化数据库结构和关系,提高数据处理效率。

通过本文内容的解释与说明,读者将能够深入了解MySQL数据库设计规约,并能够在实际项目中灵活应用。

同时,也将对构建高效可靠的MySQL数据库系统具备更加全面和深入的认识。

2. 数据库设计规约解释说明2.1 数据库设计规约的定义和作用数据库设计规约是指在设计和开发数据库时需要遵循的一系列规范和准则。

它们旨在确保数据库的结构合理、高效,并且能够满足系统需求。

mysql建表原则

mysql建表原则

mysql建表原则MySQL建表原则MySQL是一种常用的关系型数据库管理系统,它的建表原则对于数据库设计和优化非常重要。

下面我们将详细介绍MySQL建表的原则,以便开发人员能够更好地利用MySQL数据库。

一、命名规范1.1 表名表名应该简洁明了,不要使用过长或者过于复杂的名称。

可以使用下划线(_)或者驼峰式命名法来命名表名。

1.2 列名列名也应该简洁明了,不要使用过长或者过于复杂的名称。

可以使用下划线(_)或者驼峰式命名法来命名列名。

二、数据类型选择2.1 数值类型在选择数值类型时,应该根据实际需要选择合适的数据类型。

比如:tinyint、smallint、mediumint、int和bigint等整数类型;float和double等浮点数类型。

2.2 字符串类型在选择字符串类型时,应该根据实际需要选择合适的数据类型。

比如:char、varchar和text等字符类型;binary、varbinary和blob等二进制类型。

三、主键与索引设计3.1 主键设计每个表都应该有一个主键,并且主键应该是唯一的。

通常情况下,主键使用自增长整数作为标识符。

3.2 索引设计在设计索引时,应该根据实际需要选择合适的索引类型。

比如:普通索引、唯一索引、全文索引和空间索引等。

四、表的结构设计4.1 表的字段设计在设计表的字段时,应该遵循以下原则:(1)尽量避免使用NULL值,因为它会占用额外的存储空间。

(2)尽量避免使用TEXT和BLOB类型,因为它们会占用大量的存储空间。

(3)尽量避免使用ENUM类型,因为它会增加查询的复杂度。

4.2 表的关系设计在设计表之间的关系时,应该遵循以下原则:(1)使用外键来建立表之间的关系。

(2)避免使用多对多关系,因为它会增加查询和维护的复杂度。

(3)尽量将数据拆分成多个表,以便更好地管理和维护数据。

五、性能优化原则5.1 数据库范式化将数据分解成多个独立的表,并通过外键建立关联。

mysql数据库设计原则

mysql数据库设计原则

mysql数据库设计原则MySQL数据库设计原则MySQL是一个开源的关系型数据库管理系统,被广泛用于各种应用程序中。

在设计MySQL数据库时,需要遵循一些原则,以确保数据库的正常运行和高效性能。

本文将介绍一些重要的MySQL数据库设计原则。

一、数据类型选择1.1 整数类型在MySQL中,整数类型有多种选择,如TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。

在选择整数类型时,需要根据实际情况来确定所需的最小和最大值范围,并选择最小的数据类型来存储数据。

这样可以节省存储空间,并提高查询速度。

1.2 字符串类型在MySQL中,字符串类型有多种选择,如CHAR、VARCHAR、TEXT和BLOB等。

在选择字符串类型时,需要考虑到所需存储的字符集、字符长度和是否需要进行全文搜索等因素,并根据实际情况来确定所需的最小和最大长度,并选择最小的数据类型来存储数据。

二、表设计2.1 表命名规范为了方便管理和维护数据库,在设计表时应该遵循一定的命名规范。

表名应该具有描述性,并且使用下划线来分隔单词。

2.2 数据库范式为了保证数据完整性和减少冗余数据,在设计表时应该遵循一定的数据库范式。

通常情况下,应该尽可能地将数据分解成更小的表,并使用外键来关联这些表。

2.3 索引设计在MySQL中,索引是提高查询速度的重要手段。

在设计表时,应该根据实际情况来选择需要创建索引的列,并使用合适的索引类型来提高查询速度。

三、安全性设计3.1 用户权限管理在MySQL中,用户权限管理是非常重要的。

应该根据实际情况为每个用户分配不同的权限,并且定期更新密码和修改访问权限。

3.2 数据库备份和恢复为了保证数据安全性,在设计数据库时应该考虑到数据备份和恢复问题。

可以使用MySQL自带的备份工具或第三方工具进行备份,以便在出现故障时能够快速恢复数据。

四、性能优化4.1 查询优化在MySQL中,查询是最常用的操作之一。

MySQL数据库开发的三十六条军规-石展

MySQL数据库开发的三十六条军规-石展

避免负向查询和% 前缀模糊查询
• 避免负向查询
NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、 NOT LIKE等
• 避免 % 前缀模糊查询
B+ Tree 使用不了索引 导致全表扫描
• 举例
MySQL> select * from post WHERE title like ‘北京%' ; 298 rows in set (0.01 sec) MySQL> select * from post WHERE title like '%北京%' ; 572 rows in set (3.27 sec)
• 注意控制IN的个数,建议n小于200 • 举例
Select * from opp WHERE phone=‘12347856' or phone=‘42242233' \G Select * from opp WHERE phone in ('12347856' , '42242233')
改写OR为UNION
• 单表多少字段合适? • 单表1G体积 500W行评估
顺序读1G文件需N秒 单行不超过200Byte 单表不超50个纯INT字段 单表不超20个CHAR(10)字段
• 单表字段数上限控制在20~50个
平衡范式与冗余
• 平衡是门艺术
严格遵循三大范式?
效率优先、提升性能
没有绝对的对与错 适当时牺牲范式、加入冗余 但会增加代码复杂度
• 不同字段,将or改为union
• 减少对不同字段进行 "or" 查询 • Merge index往往很弱智 • 如果有足够信心:set global optimizer_switch='index_merge=off';
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MySQL DB规范目录简介 (3)目的 (3)适用范围 (3)数据库设计 (3)引擎及版本选择 (3)基础规范 (3)命名规范 (5)库表设计规范 (5)字段设计 (6)常用数据类型: (6)数据类型使用建议: (6)索引规范 (8)索引准则 (8)索引禁忌 (8)不使用外键 (9)SQL设计 (10)简介介绍在使用mysql中各种注意事项和优化细节目的供开发人员参考,合理利用MySQL特性,开发出更高效的代码减少后端数据库压力,让整个系统高效稳定运行适用范围业务数据库使用的是MySQL的数据库。

数据库设计实现目标:业务功能实现、数据的扩展性、普遍性适用性业务中80%+的性能优化是来自架构设计的优化引擎及版本选择根据业务特性选择合适的存储引擎,默认选择InnoDB存储引擎,原因如下(MyISAM与InnoDB比较):基础规范所有库表默认使用INNODB存储引擎,MyISAM适用场景非常少●库表字符集使用UTF8,原因如下:使用utf8字符集,如果是汉字,占3个字节,但ASCII码字符还是1个字节;统一不会有转换产生乱码风险;其他地区的用户(美国、印度、台湾)无需安装简体中文支持,就能正常看您的文字,并且不会出现乱码。

UTF-8最大的一个特点,就是它是一种变长的编码方式。

它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。

因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

剩下的没有提及的二进制位,全部为这个符号的unicode码。

●所有表和字段都需要添加注释,以方便其它开发及dba了解●单表数据量纯int型建议控制在1000w以内,含char型的建议500w以内,行平均长度控制在16KB以内,单表20GB以内●不在数据库中存储图片、文件等大数据.原因如下:1、对数据库的读写速度永远赶不上文件系统的处理速度2、数据库备份会变的很臃肿,备份很耗时间3、对文件的访问需要通过你的应用和数据库●临时短命数据尽量不要存到数据库中,建议存放于前端的memcache、redis等nosql中,减少后端数据库压力●禁止在线上做压力测试●禁止从测试、开发环境直接连接线上数据库●用数据库来持久化存储以及保证事务一致性,不是运算器,在应用层实现计算●读写分离,主库只写和少量实时读取请求,使用从库来查询。

●采用队列方式合并多次写请求,持续写入避免瞬间压力●超长text/blob进行垂直拆分,并先行压缩●冷热数据进行水平拆分(如6个月前后数据),LRU原则●快速更新频繁和大数据表禁止直接运行count(*)统计●压力分散,在线表和归档表(日志表)分开存储;不重要的非实时查询日志不要存数据库,以文件方式在应用端统计分析。

●禁止明文存储机密数据,需至少两次加密(部分数据可逆运算)命名规范●库名、表名、字段名必须使用小写字母,不同含义采用下划线分割●库名、表名、字段名禁止超过32个字符,名称必须是易于理解,见名知意,能表达表的功能的英文单词或缩写英文单词,多个用_来连接●库名、表名、字段名禁止使用MySQL保留字如:create、alter、add、desc、delete,union,sleep等mysql>create database create;ERROR1064(42000):You have an error in your SQL syntax;check the manual that corresponds toyour MySQL server version for the right syntax to use near'create'at line1#使用了MySQL保留字mysql>●临时库、临时表须以tmp为前缀或后缀,以日期结尾。

如:tmp_sub_order●备份库须以bak_日期结尾(如:test_order_bak_20140430)对象命名汇总表对象名前后缀范例描述表(table)tbl_系统功能简写_tbl_order_main临时表用tmp_前缀视图(view)vw_系统功能简写_vw_commodity_age_prop一般索引(normalindex)idx_idx_order_sub_create_time表名或字段名过长,采用简写唯一索引(uniqueindex)udx_udx_login_name主键(primary key)pk_pk_login_id Mysql不支持可以注释实现库表设计规范●禁止使用分区表●用HASH进行散表,表名后缀使用十进制数,下标从0开始●按日期时间分表需符合YYYY[MM][DD][HH]对于无法按日期时间分表的建议按id最后一位或最后两位分库分表存储●采用合适的分库分表策略。

如:十库百表、百库百表等字段设计拆分大字段和访问频率低的字段,按访问频率把字段拆分开,如:大字段和访问频率低的字段放一起。

订单类的可按按日期存放,数据分离冷热数据。

常用数据类型:类型长度(字节)范围tinyint1有符号-128~127无符号0~255smallint2有符号-32768~32767无符号0~65535mediumint3有符号-8388608~8388607无符号0~1677215int\integer4有符号-2147483648~2147483647无符号0~4294967295bigint8有符号-9223372036854775808~9223372036854775807无符号0~18446744073709551615float4最小值+-1.175494351Estate-38最大值+-3.42823466E+38double8最小值+-2.225073855072014E-308最大值+-1.7976931348623157E+308decimal(m,d)m+2字节m+2最大取值与double相同,给定decimal的有效取值由m和d决定char(m)m M为0~255之间的整数,在存储数据时会删除尾部空格varchar(m)m M为0~65535之间的整数,值的长度+1个字节。

tinyblob值+1允许长度0~255字节blob值+1允许长度0~65535字节(可存二进制文件)拒绝使用mediumblob值+3允许长度0~167772150字节longblog值+4允许长度0~4294967295字节tinytext值+2允许长度0~255字节Text值+2允许长度0~65535字节mendiumtext值+4允许长度0~167772150字节varbinary(m)值+1允许长度0~M个字节的变长字节字符串binary(m)m允许长度0~M个字节的定长字节字符串enum值枚举型数据类型使用建议:●尽可能不使用TEXT、BLOB类型,Text类型在MySQL中处理性能远低于varchar类型,如果必须使用建议按拆分原则(冷热数据、大字段)拆到单独的表中,原因如下:1.强制生成硬盘临时表2.浪费更多的空间3.Varchar(65535)==>64K(在utf8下)●用DECIMAL代替FLOAT和DOUBLE存储精确浮点数●将字符转化为数字●存储字符型数据时,尽可能先压缩或者序列化●优先使用ENUM类型数据(mysql会字段转换为数字储存)mysql>show create table user_info;+----------------+--------------------------+|Table|Create Table|+----------------+--------------------------+|user_info|CREATE TABLE`user_info_temp`(`id`int(5)NOT NULL AUTO_INCREMENT COMMENT'分类ID',`sex`enum('M','F')NOT NULL COMMENT'性别',PRIMARY KEY(`id`))ENGINE=MyISAM DEFAULT CHARSET=utf8|+----------------+--------------------------+1row in set(0.00sec)mysql>●可使用TINYINT来代替ENUM类型●显式约束:NOT NULL●所有避免使用null值(索引列禁止使用null),null值缺点如下:Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。

可空列需要更多的存储空间),还需要mysql内部进行特殊处理。

可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam中固定大小的索引变成可变大小的索引;查询时使用is null或is not null数字类型不会使用索引,字符只有is not null才会使用到索引●使用UNSIGNED存储非负整数,整数类型有可选unsigned属性,表示不允许负数,大概可以提高正数上限一倍如:tinyint unsigned可以存放范围是0~255,而tinyint范围是-128~127●INT类型固定占用4字节存储●使用timestamp(4字节int unsigned,且效率非常高)存储时间,而非使用date/datetime/char/varcharTIMESTAMP的变体TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP在创建新记录和修改现有记录的时候都对这个数据列刷新TIMESTAMP DEFAULT CURRENT_TIMESTAMP在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它TIMESTAMP ON UPDATE CURRENT_TIMESTAMP在创建新记录的时候把这个字段设置为0,以后修改时刷新它TIMESTAMP DEFAULT‘yyyy-mm-dd hh:mm:ss’N UPDATE CURRENT_TIMESTAMP在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它●使用int unsigned存储IPV4才4字节(mysql内置INET_ATON/INET_NTOA函数快速转换),采用char至少15字节索引规范●索引的用途:去重、加速定位、避免排序、覆盖索引(在索引里直接取到要用的数据,非常快速)●索引数量:单张表中索引数量尽量不要超过5个,单个索引中的字段数不超过5个●对字符串使用前缀索引,前缀索引长度不超过8个(建议优先考虑前缀索引)●根据业务查询需要多列查询时尽量选择建立组合索引:对于组合索引列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。

相关文档
最新文档