数据库设计规范_第1页
数据库设计规范_第2页
数据库设计规范_第3页
数据库设计规范_第4页
数据库设计规范_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库设计规范⽬录数据库设计规范1.2.所有数据库对象名称必须使⽤⼩写字母并⽤下划线分割所有数据库对象名称禁⽌使⽤保留关键字3.数据库对象的命名要能做到见名识义,并且最好不要超过32个字符4.临时表以tmp为前缀并以⽇期为后缀,备份表必须以bak为前缀并以⽇期为后缀5.所有存储相同数据的列名和列必须⼀致数据库基本设计规范1.所有表必须使⽤InnoDB存储引擎:a)b)⽀持事务,⾏级锁,更好的恢复性,⾼并发下性能更好Mysql5.5以前使⽤的是MyISAM引擎,5.6以后使⽤InnoDB作为默认存储引擎2.数据库和表的字符集统⼀使⽤UTF8a)b)统⼀字符集可以避免由于字符集转换产⽣的乱码MySQL中UTF8字符集汉字占3个字节,ASCII码占⽤⼀个字节3.所有的表和字段都需要添加注释a)b)使⽤comment从句添加表和列的备注从⼀开始就进⾏数据字典的维护4.尽量控制单表数据量的⼤⼩,建议控制在500万⾏以内可以⽤历史数据归档,分库分表等⼿段来控制数据量的⼤⼩谨慎使⽤MySQL分区表a)5.a)分区表在物理上表现为多个⽂件,在逻辑上表现为⼀个表b)c)谨慎选择分区键,跨分区查询效率可能更低建议采⽤物理分表的⽅式管理⼤数据6.尽量做到冷热数据分离,减⼩表的宽度a)减少磁盘IO,保证热数据的内存缓存命中率b)c)更有效的利⽤缓存,避免读⼊⽆⽤的冷数据经常⼀起使⽤的列放到⼀个表中7.禁⽌在表中建⽴预留字段a)b)c)预留字段的命名很难做到见名识义预留字段⽆法确认存储的数据类型,所以⽆法选择合适的类型对预留字段类型的修改,会对表进⾏锁定8.禁⽌在数据库中存储图⽚,⽂件等⼆进制数据a)⼀般存储在⽂件服务器中,⽽数据库存储其地址9.禁⽌在线上做数据库压⼒测试(上线后)10.禁⽌从开发环境,测试环境直连⽣产环境数据库索引设计规范数据库索引到底是什么,是怎样⼯作的?联合索引优化多条件查询:前缀索引的索引选择性在mysql中建⽴前缀索引的意义在于相对于整列建⽴索引,前缀索引仅仅是选择该列的部分字符作为索引,减少索引的字符可以节约索引空间,从⽽提⾼索引效率,但这样也会降低索引的选择性关于索引的选择性,它是指不重复的索引值(也称为基数cardinality)和数据表的记录总数的⽐值,范围从1/(数据表记录总数)到1之间。索引的选择性越⾼则查询效率越⾼,因为选择性⾼的索引可以让MySQL在查找时过滤掉更多的⾏。选择性为1的索引叫唯⼀索引,这是最好的索引选择性,性能也是最好的建⽴合理前缀索引的诀窍在于要选择⾜够长的前缀以保证较⾼的选择性,同时⼜不能太长(以便节约空间)。前缀应该⾜够长,以使得前缀索引的选择性接近于索引的整个列。换句话说,前缀的基数应该接近于完整列的基数1.限制每张表上的索引数量,建议单张表索引不超过5个索引并不是越多越好!索引可以提⾼效率同样可以降低效率a)b)禁⽌给表中的每⼀列都建⽴单独的索引2.每个InnoDB表必须有⼀个主键a)不使⽤更新频繁的列作为主键,不适⽤多列主键b)c)不使⽤UUID,MD5,HASH,字符串列作为主键(因为他们⽣成的值⽆序)主键建议选择使⽤⾃增ID值3.在哪些列上建⽴索引a)b)c)Select、update、delete语句的where从句中的列包含在Orderby、groupby、distinct中的字段多表Join的关联列4.合理选择复合索引列的顺序a)区分度最⾼的列(主键和唯⼀索引)放在联合索引的最左侧i.mysql使⽤联合索引只使⽤左侧部分,例如INDEX(a,b,c),当条件为a或a,b或a,b,c或a,c时都可以使⽤索引,但是当条件为b,c时将不会使⽤索引。b)c)d)尽量把字段长度⼩的列放在联合索引的最左侧使⽤最频繁的列放到联合索引的左侧离散度更⾼的索引应该放在联合索引的左侧5.避免建⽴冗余索引和重复索引a)b)c)重复索引:索引列完全重复冗余索引:部分索引列是冗余的(index(a,b,c)、index(a,b)、index(a),a是冗余的会损害数据库性能,查询优化器在⽣成查询计划时,不得不根据统⼀信息对多个重复或者冗余的索引进⾏评估,从⽽⽣成最优的执⾏计划,降低查询性能。6.对于频繁的查询优先考虑使⽤覆盖索引a)b)c)覆盖索引:就是包含了所有需要查询字段的索引,按照键值的顺序存储避免InnoDB表进⾏索引的⼆次查找(找到主键以后再⽤主键找到所有数据)可以把随机IO变为顺序IO加快查询效率(磁盘处理顺序IO⽐直接IO快的多)7.尽量避免使⽤外键(约束)a)b)c)不建议使⽤外键约束,但⼀定在表与表之间的关联键上建⽴索引外键可⽤于保证数据的参照完整性,但建议在业务端实现外键会影响⽗表和⼦表的写操作从⽽降低性能(每次写操作都要检验外键约束是否成⽴,从⽽降低数据库写性能,在业务中,写性能往往⽐⼀致性更加重要)数据库字段设计规范1.优先选择符合存储需要的最⼩的数据类型a)将字符串转化为数字类型存储(IP转换为int类型存储)i.INET_ATON(‘255.255.255.255’)=4294967295ii.INET_NTOA(4294967295)=’255.255.255.255’VARCHAR(N)中的N代表的是字符数,⽽不是字节数i.使⽤UTF8存储汉字varchar(255)=可以存储255个汉字,占⽤765个字节过⼤的长度会消耗更多的内存b)c)d)e)⽆符号相对于有符号可以多出⼀倍的存储空间对于⾮负数据采⽤⽆符号类型进⾏存储2.避免使⽤TEXT、BLOB数据类型a)b)建议把BLOB或是TEXT列分离到单独的扩展表中BLOB或TEXT只能使⽤前缀索引,因为MySQL不允许索引这些列的完整长度3.避免使⽤ENUM数据类型a)b)c)本质是字符串,内部是⽤整型存储修改ENUM值需要使⽤ALTER语句,对表结构修改容易造成操作失误ENUM类型的ORDERBY操作效率低,需要额外操作i.需要将整型转换为字符串型,再进⾏排序d)禁⽌使⽤数值作为ENUM的枚举值4.尽可能把所有列定义为NOTNULLa)索引NULL列需要额外的空间来保存,所以要占⽤更多的空间

b)进⾏⽐较和计算时要对NULL值做特别的处理5.不要⽤字符串存储⽇期型的数据a)b)字符串⽆法⽤⽇期函数进⾏计算和⽐较⽤字符串要占⽤更多的空间(⾄少要16个字节,datetime只要8个)6.使⽤TIMESTAMP或DATETIME类型存储时间a)b)TIMESTAMP:4个字节(int也是),只能存储1970年~2038年的时间DATETIME:8个字节7.同财务相关的⾦额类数据,必须使⽤decimal类型a)b)⾮精准浮点:float、double精准浮点:Decimal,在计算时不会丢失精度,占⽤空间由定义的宽度决定i.每4个字节存储9位数字,⼩数点占⽤⼀个字节ii.可⽤于存储⽐bigint更⼤的整数数据数据库SQL开发规范1.建议使⽤预编译语句进⾏数据库操作a)b)c)只传参数,⽐传递SQL语句更⾼效相同语句可以⼀次解析,多次使⽤,提⾼处理效率可以有限地防范SQL注⼊的风险2.避免数据类型的隐式转换a)会导致索失引效i.Selectnamefromcustomerwhereid=’1’(id为int传⼊string)合理利⽤存在索引⽽,不是盲⽬增加索引充分利⽤表上已经存在的索引3.4.a)避免使⽤双%号的查询条件。如alike‘%123%’5.⼀个SQL只能利⽤到复合索引中的⼀列进⾏范围查询6.使⽤leftjoin或notexists来优化notin操作a)Notin会使索失引效7.数据库设计时,应该要对以后扩展进⾏考虑8.程序连接不⽤的数据库使⽤不同的账号,禁⽌跨库查询为数据库迁移和分库分表留出余地a)b)降低业务耦合度

c)避免权限过⼤⽽产⽣的安全风险9.禁⽌使⽤select*必须使⽤select<字段列表>查询a)b)消耗更多的cpu和io以及⽹络带宽资源⽆法使⽤覆盖索引i.覆盖索引是select的数据列只⽤从索引中就能够取得,不必读取数据⾏,换句话说查询列要被所建的索引覆盖。可减少表结构变更带来的影响c)10.禁⽌使⽤不含字段列表的insert语句a)b)c)Insertintotvalues(‘a’,’b’,’c’);à禁⽌Insertintot(c1,c2,c3)values(‘a’,’b’,’c’);可减少表结构变更带来的影响11.避免使⽤⼦查询,可以把⼦查询优化为join操作a)b)c)⼦查询的结果集⽆法使⽤索引(对查询结果很⼤的影响很⼤)⼦查询会产⽣临时表操作,如果⼦查询数据量⼤则严重影响效率消耗过多的CPU及IO资源12.避免使⽤JOIN关联太多的表a)b)c)每join⼀个表会多占⼀部分内存(join_buffer_size)会产⽣临时表操作,影响查询效率MySQL最多允许关联61个表,建议不超过5个13.减少同数据库的交互次数a)b)数据库更适合处理批量操作合并多个相同的操作到⼀起,可以提⾼处理效率14.使⽤in代替ora)b)In的值不要超过500个In操作可以有效的利⽤索引15.禁⽌使⽤orderbyrand()进⾏随机排序a)b)c)会把表中所有符号条件的数据装载到内存中进⾏排序会消耗⼤量的CPU好IO及内存资源推荐在程序中获取⼀个随机值,然后从数据库中获取数据的⽅式16.Where从句中禁⽌对列进⾏函数转换和计算a)对列进⾏函数转换或计算会导致⽆法使⽤索引i.Wheredate(createtime)=’20160901’ii.Wherecreatetime>=’20160901’andcreatetime<’20160902’iii.以上的⽅式可以使⽤到createtime这个索引17.在明显不会有重复值时使⽤UNIONALL⽽不是UNION

a)b)UNION会把所有数据放到临时表中后再进⾏去重操作UNIONALL不会再对结果集进⾏去重操作18.拆分复杂的⼤SQL为多个⼩SQLa)b)MySQL⼀个SQL只能使⽤⼀个CPU进⾏计算SQL拆分后可以通过并⾏执⾏来提⾼处理效率数据库操作⾏为规范1.超100万⾏的批量写操作,要分批多次进⾏操作⼤批量操作可能会造成严重的主从延迟a)b)c)Binlog⽇志为row格式时会产⽣⼤量的⽇志避免产⽣⼤事务操作(锁定多个⾏表)2.对⼤表数据结构的修改⼀定要谨慎,会造成严

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论