码迷,mamicode.com
首页 > 数据库 > 详细

mysql

时间:2018-08-25 20:12:21      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:处理   账号   数据   对象   批量   md5   生产环境   定义   insert   

一、基本设计规范

1.数据库对象名称禁止使用mysql关键字

2.对象名称必须使用小写字母并用下划线分割

3.禁止在数据库中存储图片、文件等二进制数据

4.所有表必须使用innodb存储引擎

5.数据库和表的字符集统一使用utf-8

6.所有表和字段都需要添加注释

7.尽量控制单表数据量的大小,建议在500w以内

8.谨慎使用mysql分区表

9.尽量做到冷热数据分离,减小表的宽度

10.禁止在表中建立预留字段

11.禁止在线上做数据库压力测试

12.禁止从开发环境,测试环境直连生产环境数据库

 

二、索引设计规范

1.限制每张表上的索引数量,建议单张表索引不超过5个

2.每个innodb表必须有一个主键

  不使用更新频繁的列作为主键,不使用多列主键

  不使用UUID,MD5,HASH,字符串列作为主键

  主键建议选择使用自增ID

3.常见索引列建议

  select、update、delete语句的where从句中的字段

  包含在orderby、groupby、distinct中的字段

  多表join的关联列

4.如何选择索引列的顺序

  区分度最高的列放在联合索引的最左侧

  尽量把字段长度小的列放在联合索引的最左侧

  使用最频繁的列放在联合索引的左侧

5.避免建立冗余索引和重复索引

6.对于频繁的查询优先考虑使用覆盖索引

  覆盖索引:即覆盖所有查询字段的联合索引

7.尽量避免使用外键

  外键可用于保证数据的参照完整性,但建议在业务端实现

  外键会影响父表和子表的写操作从而降低性能

 

三、数据库字段设计规范

1.优先选择符合存储需要的最小的数据类型

  将字符串化为数字类型存储

  对于非负数据采用无符号整型进行存储

  varchar(n)中的n代表的是字符数,而不是字节数

  过大的长度会消耗更多的内存

2.避免使用text、blob数据类型

  建议把blob或text列分离到单独的扩展表中

  text或blob类型只能使用前缀索引

3.避免使用ENUM数据类型

4.尽可能把所有列定义为not null

  索引null列需要额外的空间来保存,所以会占用更多的空间

  进行比较和计算时要对null值做特别的处理

5.使用timestamp或datetime类型存储时间

6.同财务相关的金额类数据,必须使用decimal类型

  decimal类型为精准浮点数,在计算时不会丢失精度

  占用空间由定义的宽度决定

 

四、数据库sql开发规范

1.建议使用预编译语句进行数据库操作

2.避免数据类型的隐式转换

  隐式转换会导致索引失效

3.充分利用表上已经存在的索引

  避免使用双%号的查询条件。如a like ‘%123%’

  一个sql只能利用到符合索引中的一列进行范围查询

  使用left join或not exists来代替not in操作,not in可能导致索引失效

4.程序连接不同的数据库使用不同的账号,禁止跨库查询

  为数据库迁移和分库分表留出余地

  降低业务耦合度

5.禁止使用select *,必须使用select(字段列表)查询

  消耗更多的cpu和io以及网络宽带资源

  无法使用覆盖索引

  可减少表结构变更带来的影响

6.禁止使用不含字段列表的insert语句

  如:insert into t values(‘a’,‘b‘)

7.避免使用子查询,可以把子查询优化为join操作

  子查询的结果集无法使用索引

  子查询会产生临时表操作,如果子查询数据量大则严重影响效率

  消耗过多的cpu和io资源

8.避免使用join关联太多的表

9.减少同数据库的交互次数

  数据库更适合处理批量的操作

  合并多个相同的操作到一起,可以提高处理效率

10.使用in代替or

  in的值不要超过500个

  in操作可以用到索引

11.禁止使用order by rand()进行随机排序

  会把表中所有符合条件的数据装载在到内存中进行排序

  会消耗大量的cup和io资源

  推荐在程序中获取一个随机值,然后从数据库中获取数据的方式

12.where从句中禁止对列进行函数转换和计算

  对列进行函数转换或计算会导致无法使用索引

  where date(createtime) = "20160901" 这样不会使用createtime列上的索引

13.在明显不会有重复值时使用union all而不是union

  union会把所有数据放到临时表中再进行去重操作

  union all不会再对结果集进行去重操作

14.拆分复杂的大sql为多个小sql

  mysql一个sql只能使用一个cup进行计算

  sql拆分后可以通过并行执行来提高操作效率

     

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

mysql

标签:处理   账号   数据   对象   批量   md5   生产环境   定义   insert   

原文地址:https://www.cnblogs.com/kkyl/p/9534993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!