一份基本的mysql规范

一、命名规范
mysql字符集应选择utf8mb4这个字符集而不是utf8

1、所有数据库对象名称必须使用小写字母并用下划线分割;
2、临时库表必须以tmp_为前缀并以日期作为后缀。备份表必须以bak_为后缀并以日期为后缀
3、所有存储相同数据的列明和列类型必须一致(一般作为关联列,如果查询是关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效。)

二、基本设计规范

1、所有表必须使用innodb存储引擎(没有特殊要求,即innodb无法满足的功能:列存储,存储空间数据等等),innodb支持事务,支持行级锁,更好的恢复性,高并发下性能更好
2、所有表和字段添加注释
3、尽量做到冷热数据分离,减小表的宽度(现在这样的数据库,其实是完全可以支持现有业务,但考虑到以后随着数据量的日益增长,每次查询都要在千万数据中查找,但其实大部分查询,都是查最近的数据,历史数据几乎不查询,基于这个条件,就考虑到可以做个分库,也就是冷热分离,比如我现在有一个订单表,日均写入几万几十万数据进去,可以这样处理,存储数据的时候存储双份,order表存一份数据,order_history表同样也存一份数据,然后呢,order表弄一个定时任务,每天定期删除30天以上的数据(一般半夜删数据),一天无非几万条数据,性能影响几乎没有,不过量多的话,删除就要小心点,不然很容易就锁表,可以查一下一个月前的数据的区间范围(表的主键id范围),然后呢按区间删除,几千几千的删除(可以自行调节,保证 IOPS跟CUP别跑满就行),这样就能保证不会锁表;order_history表不做任何删除操作,只插入新的数据,保留最原始的数据。)
4、禁止在数据库中存储图片,文件等大的二进制数据

三、字段设计规范

1、优先选择存储需要的最小的数据类型:
	1)将字符串转成数字类型存储,如:ip地址转成整形数据
	2)对于非负型的数据(自增),尽量选用无符号整型存储,可以多出一倍的存储空间
2、避免使用text、blob的数据类型
	mysql内存临时表不支持text,blob这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行,而且对于这样的数据,mysql还是要进行二次查询,使sql性能变的很差。
	如果非要用,将text或者blob分离到单独的扩展表
3、避免使用enum类型
	修改enum需要ALTER语句,enum类型的ORDER BY效率低
4、尽可能把所有列定义为NOT NULL
	索引NULL列需要额外的空间来保存,所以要占用更多的空间
	进行比较和计算时要对NULL值做特别的处理
5使用TIMESTAMP(4个字节)或DATATIME(8个字节)存储时间
	TIMESTAMP存储时间范围:1970-01-01 00:00:01~2038-01-19 03:14:07
	TIMESTAMP占用4字节与int相同,但是可读性更高。超出这个范围使用DATATIME
6、财务相关金额类数据必须使用decimal类型,计算时不会丢失精度,占用空间由定义宽度决定

四、索引设计规范

1、限制单张表索引数量,建议不超过5个
	索引能提高效率同样能降低效率。增加查询效率,降低插入和更新效率
	使用联合索引查询方式更好
2、不要使用更新频繁的列作为主键,不要使用UUID,MD5,HASH,字符串列作为主键。主键建议使用自增ID列
3、常见索引建议:
	1)出现在where从句中的列
	2)包含在ORDER BY,GROUP BY,DISTINCT中的字段
	通常将1 ,2中的列奖励联合索引效率更好
	3)多表join的关联列
4、如何选择索引列的顺序
	1)区分度最高的放在联合索引的最左侧(区分度=列中不同值数量/列总行数)
	2)尽量把字段长度小的列放在联合索引的最左侧(字段长度越小,一页能存储的数据量就越大)
	3)使用最频繁的列放到联合索引的左侧
5、尽量避免使用外键约束(foeign key),但一定要在表与表的关联键上建立索引。
	外键可用于保证数据的参照完整性,但建议在业务端实现,外键会影响父表和子表的写操作从而降低性能
6、充分利用表上已经存在的索引:
	1)避免使用双%号的查询条件
	如a like ‘%123%’如果无前置%,是可以用到列上的索引的
	2)一个sql只能利用到复合索引中的一列进行范围查询
		如有a,b,c的联合索引,在查询条件中有a列的范围查询,则在b,c列上的索引将不会被用到,在定义联合索引时,如果a列要用到范围查找,就把a放到联合索引的右侧
7、禁止使用select * ,应当使用select +字段列表
	可减小表结构变更带来的影响,(改变表结构需要改sql语句)
8、禁止使用不含字段列表的insert语句
	如禁止:insert into values (a,b,c)
	应使用insert into t(c1,c2,c3) values (a,b,c)
9、对应同一列进行or判断时,使用in代替or
10、禁止使用order by rand()进行随机排序

五、操作行为规范

1、超100万行的批量写,要多次分批进行操作
	大批量进行写操作,一定是在一个事务中进行,会造成表中大批量数据进行锁定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值