mysql⽤户名命名_MySQL命名、设计及使⽤规范《MySQL命
名、设计及使⽤规范》
数据库环境
dev:开发环境,开发可读写,可修改表结构。开发⼈员可以修改表结构,可以随意修改其中的数据但是需要保证不影响其他开发同事。
qa:测试环境,开发可读写,开发⼈员可以通过⼯具修改表结构。
sim:模拟环境,开发可读写,发起上线请求时,会先在这个环境上进⾏预执⾏,这个环境也可供部署上线演练或压⼒测试使⽤。
real:⽣产数据库从库(准实时同步),只读环境,不允许修改数据,不允许修改表结构,供线上问题查,数据查询等使⽤。
online:线上环境,开发⼈员不允许直接在线上环境进⾏数据库操作,如果需要操作必须DBA进⾏操作并进⾏相应记录,禁⽌进⾏压⼒测试。
这些环境的机器,⼀定要做到权限划分明确,读写帐号分离,并且有辨识度,能区分具体业务。例如⽤户名w_account,r_ account 分别代表读、写账号,account是读写账号。
命名规范
基本命名原则
使⽤有意义的英⽂词汇,词汇中间以下划线分隔。(不要⽤拼⾳)
只能使⽤英⽂字母,数字,下划线,并以英⽂字母开头。
库、表、字段全部采⽤⼩写,不要使⽤驼峰式命名。
避免⽤ORACLE、MySQL的保留字,如desc,关键字如index。
命名禁⽌超过32个字符,须见名之意,建议使⽤名词不是动词
数据库,数据表⼀律使⽤前缀
临时库、表名必须以tmp为前缀,并以⽇期为后缀
备份库、表必须以bak为前缀,并以⽇期为后缀
为什么库、表、字段全部采⽤⼩写?
在 MySQL 中,数据库和表对就于那些⽬录下的⽬录和⽂件。因⽽,操作系统的敏感性决定数据库和表命名的⼤⼩写敏感。
Windows下是不区分⼤⼩写的。
Linux下⼤⼩写规则:
数据库名与表名是严格区分⼤⼩写的;
表的别名是严格区分⼤⼩写的;
列名与列的别名在所有的情况下均是忽略⼤⼩写的;
变量名也是严格区分⼤⼩写的;
如果已经设置了驼峰式的命名如何解决?需要在MySQL的配置⽂件my.ini中增加 lower_case_table_names = 1即可。
表命名
同⼀个模块的表尽可能使⽤相同的前缀,表名称尽可能表达含义。所有⽇志表均以 log_ 开头
字段命名
表达其实际含义的英⽂单词或简写。布尔意义的字段以“is_”作为前缀,后接动词过去分词。
各表之间相同意义的字段应同名。各表之间相同意义的字段,以去掉模块前缀的表名_字段名命名。
生产流程卡外键字段⽤表名_字段名表⽰其关联关系。
表的主键⼀般都约定成为id,⾃增类型,是别的表的外键均使⽤xxx_id的⽅式来表明。
索引命名
⾮唯⼀索引必须按照“idx_字段名称_字段名称[_字段名]”进⾏命名
唯⼀索引必须按照“uniq_字段名称_字段名称[_字段名]”进⾏命名
约束命名
主键约束:pk_表名称。
唯⼀约束:uk_表名称_字段名。(应⽤中需要同时有唯⼀性检查逻辑。)
触发器命名
trg_表名_操作。
函数过程命名
采⽤动词+名词的形式表达其含义。
序列命名
seq_表名
表设计规范
1、表引擎取决于实际应⽤场景;⽇志及报表类表建议⽤myisam,与交易,审核,⾦额相关的表建议⽤innodb引擎。如⽆说明,建表时⼀律采⽤innodb引擎。myisam与innodb的区别
2、默认使⽤utf8mb4字符集,数据库排序规则使⽤utf8mb4_general_ci,(由于数据库定义使⽤了默认,数据表可以不再定义,但为保险起见,建议都写上)。
为什么字符集不选择utf8,排序规则不使⽤utf8_general_ci?
采⽤utf8编码的MySQL⽆法保存占位是4个字节的Emoji表情。为了使后端的项⽬,全⾯⽀持客户端输⼊的Emoji表情,升级编码为
utf8mb4是最佳解决⽅案。对于JDBC连接串设置了characterEncoding为utf8或者做了上述配置仍旧⽆法正常插⼊emoji数据的情况,需要在代码中指定连接的字符集为utf8mb4。
3、所有表、字段均应⽤ comment 列属性来描述此表、字段所代表的真正含义,如枚举值则建议将该字段中使⽤的内容都定义出来。
4、如⽆说明,表中的第⼀个id字段⼀定是主键且为⾃动增长,禁⽌在⾮事务内作为上下⽂作为条件进⾏数据传递。禁⽌使⽤varchar类型作为主键语句设计。
5、如⽆说明,表必须包含create_time和modify_time字段,即表必须包含记录创建时间和修改时间的字段
6、如⽆说明,表必须包含is_del,⽤来标⽰数据是否被删除,原则上数据库数据不允许物理删除。
7、⽤尽量少的存储空间来存数⼀个字段的数据
能⽤int的就不⽤char或者varchar
能⽤tinyint的就不⽤int
使⽤UNSIGNED存储⾮负数值。
不建议使⽤ENUM、SET类型,使⽤TINYINT来代替
使⽤短数据类型,⽐如取值范围为0-80时,使⽤TINYINT UNSIGNED
存储精确浮点数必须使⽤DECIMAL替代FLOAT和DOUBLE
时间字段,除特殊情况⼀律采⽤int来记录unix_timestamp
存储年使⽤YEAR类型。
存储⽇期使⽤DATE类型。
存储时间(精确到秒)建议使⽤TIMESTAMP类型,因为TIMESTAMP使⽤4字节,DATETIME使⽤8个字节。
建议使⽤INT UNSIGNED存储IPV4。
尽可能不使⽤TEXT、BLOB类型
禁⽌在数据库中使⽤VARBINARY、BLOB存储图⽚、⽂件等。建议使⽤其他⽅式存储(TFS/SFS),MySQL只保存指针信息。
五年级数学下册教学总结单条记录⼤⼩禁⽌超过8k(列长度(中⽂)*3(UTF8)+列长度(英⽂)*1)
datetime与timestamp有什么不同?
相同点:TIMESTAMP列的显⽰格式与DATETIME列相同。显⽰宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。
不同点:
TIMESTAMP
4个字节储存,时间范围:1970-01-01 08:00:01 ~ 2038-01-19 11:14:07
值以UTC格式保存,涉及时区转化 ,存储时对当前的时区进⾏转换,检索时再转换回当前的时区。
datetime
8个字节储存,时间范围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59回家的诱惑歌词
实际格式储存,与时区⽆关
如何使⽤TIMESTAMP的⾃动赋值属性?
将当前时间作为ts的默认值:ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP。
当⾏更新时,更新ts的值:ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP。
可以将1和2结合起来:ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
如何使⽤INT UNSIGNED存储ip?
使⽤INT UNSIGNED⽽不是char(15)来存储ipv4地址,通过MySQL函数inet_ntoa和inet_aton来进⾏转化。Ipv6地址⽬前没有转化函数,需要使⽤DECIMAL或者两个bigINT来存储。
8、如⽆备注,所有字段都设置NOT NULL,并设置默认值;
9、禁⽌在数据库中存储明⽂密码
10、如⽆备注,所有的布尔值字段,如is_hot、is_deleted,都必须设置⼀个默认值,并设为0;
11、如⽆备注,排序字段order_id在程序中默认使⽤降序排列;
12、整形定义中不添加长度,⽐如使⽤INT,⽽不是INT[4]
INT[M],M值代表什么含义?
注意数值类型括号后⾯的数字只是表⽰宽度⽽跟存储范围没有关系。很多⼈他们认为INT(4)和INT(10)其取值范围分别是 (-9999到9999)和(-9999999999到9999999999),这种理解是错误的。其实对整型中的 M值与 ZEROFILL 属性结合使⽤时可以实现列值等宽。不管INT[M]中M值是多少,其取值范围还是 (-2147483648到2147483647 有符号时),(0到4294967295⽆符号时)。
显⽰宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显⽰。当结合可选扩展属性ZEROFILL使⽤时默认补充的空格⽤零代替。例如:对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显⽰宽度的⼀个值,当MySQL为复杂联接⽣成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度,如果为⼀个数值列指定ZEROFILL, MySQL⾃动为该列添加UNSIGNED属性。
13、使⽤VARBINARY存储⼤⼩写敏感的变长字符串
什么时候⽤CHAR,什么时候⽤VARCHAR?
CHAR和VARCHAR类型类似,但它们保存和检索的⽅式不同。它们的最⼤长度和是否尾部空格被保留等⽅⾯也不同。CHAR和VARCHAR类型声明的长度表⽰你想要保存的最⼤字符数。例如,CHAR(30)可以占⽤30个字符。
CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进⾏⼤⼩写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最⼤有效长度由最⼤⾏⼤⼩和使⽤的字符集确定。整体最⼤长度是65,532字节)。
同CHAR对⽐,VARCHAR值保存时只保存需要的字符数,另加⼀个字节来记录长度(如果列声明的长度超过255,则使⽤两个字节)。VARCHAR值保存时不进⾏填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
char适合存储⽤户密码的MD5哈希值,它的长度总是⼀样的。对于经常改变的值,char也好于varchar,因为固定长度的⾏不容易产⽣碎⽚,对于很短的列,char的效率也⾼于varchar。char(1)字
符串对于单字节字符集只会占⽤⼀个字节,但是varchar(1)则会占⽤2个字节,因为1个字节⽤来存储长度信息。
论文研究方法有哪些索引设计规范
MySQL的查询速度依赖良好的索引设计,因此索引对于⾼性能⾄关重要。合理的索引会加快查询速度(包括UPDATE和DELETE的速
度,MySQL会将包含该⾏的page加载到内存中,然后进⾏UPDATE或者DELETE操作),不合理的索引会降低速度。MySQL索引查类似于新华字典的拼⾳和部⾸查,当拼⾳和部⾸索引不存在时,只能通过⼀页⼀页的翻页来查。当MySQL查询不能使⽤索引时,MySQL会进⾏全表扫描,会消耗⼤量的IO。索引的⽤途:去重、加速定位、避免排序、覆盖索引。
什么是覆盖索引?
InnoDB存储引擎中,secondary index(⾮主键索引)中没有直接存储⾏地址,存储主键值。如果⽤户需要查询secondary index中所不包含的数据列时,需要先通过secondary index查到主键值,然后再通过主键查询到其他数据列,因此需要查询两次。覆盖索引的概念就是查询可以通过在⼀个索引中完成,覆盖索引效率会⽐较⾼,主键查询是天然的覆盖索引。合理的创建索引以及合理的使⽤查询语句,
当使⽤到覆盖索引时可以获得性能提升。⽐如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,适当时候可以将索引添加为index(uid,email),以获得性能提升。
索引的基本规范
1、索引数量控制,单张表中索引数量不超过5个,单个索引中的字段数不超过5个。
综合评估数据密度和分布
考虑查询和更新⽐例
为什么⼀张表中不能存在过多的索引?
独一无二的名InnoDB的secondary index使⽤b+tree来存储,因此在UPDATE、DELETE、INSERT的时候需要对b+tree进⾏调整,过多的索引会减慢更新的速度。
2、对字符串使⽤前缀索引,前缀索引长度不超过8个字符,建议优先考虑前缀索引,必要时可添加伪列并建⽴索引。
不要索引blob/text等字段,不要索引⼤型字段,这样做会让索引占⽤太多的存储空间
什么是前缀索引?
前缀索引说⽩了就是对⽂本的前⼏个字符(具体是⼏个字符在建⽴索引时指定)建⽴索引,这样建⽴起来的索引更⼩,所以查询更快。 前缀索引能有效减⼩索引⽂件的⼤⼩,提⾼索引的速度。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使⽤前缀索引,也不能把它们⽤作覆盖索引(Covering Index)。
可爱的女生网名
建⽴前缀索引的语法:ALTER TABLE table_name ADD KEY(column_name(prefix_length));
3、主键准则
表必须有主键
不使⽤更新频繁的列
尽量不选择字符串列
不使⽤UUID MD5 HASH
默认使⽤⾮空的唯⼀键
建议选择⾃增或发号器
4、 重要的SQL必须被索引,核⼼SQL优先考虑覆盖索索引
UPDATE、DELETE语句的WHERE条件列
ORDER BY、GROUP BY、DISTINCT的字段
多表JOIN的字段
5、区分度最⼤的字段放在前⾯
选择筛选性更优的字段放在最前⾯,⽐如单号、userid等,type,status等筛选性⼀般不建议放在最前⾯
索引根据左前缀原则,当建⽴⼀个联合索引(a,b,c),则查询条件⾥⾯只有包含(a)或(a,b)或(a,b,c)的时候才能⾛索引,(a,c)作为条件的时候只能使⽤到a列索引,所以这个时候要确定a的返回列⼀定不能太多,不然语句设计就不合理,(b,c)则不能⾛索引
合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)
6、索引禁忌
不在低基数列上建⽴索引,例如“性别”
不在索引列进⾏数学运算和函数运算
不要索引常⽤的⼩型表
7、 尽量不使⽤外键
外键⽤来保护参照完整性,可在业务端实现
对⽗表和⼦表的操作会相互影响,降低可⽤性
INNODB本⾝对online DDL的限制
MYSQL 中索引的限制
MYISAM 存储引擎索引长度的总和不能超过 1000 字节
BLOB 和 TEXT 类型的列只能创建前缀索引
MYSQL ⽬前不⽀持函数索引
使⽤不等于 (!= 或者 <>) 的时候, MYSQL ⽆法使⽤索引。
过滤字段使⽤函数运算 (如 abs (column)) 后, MYSQL⽆法使⽤索引。
join语句中join条件字段类型不⼀致的时候MYSQL⽆法使⽤索引
使⽤ LIKE 操作的时候如果条件以通配符开始 (如 ‘%abc…’)时, MYSQL⽆法使⽤索引。
使⽤⾮等值查询的时候, MYSQL ⽆法使⽤ Hash 索引。