数据库设计规约以及SQL优化策略

一.设计规范

  1. 建表约束
    1. 必须有字段id(主键id,一般设置为自增(步数为1),当并发性需求较高的时候,不建议自增,可以自定义实现机制), create_time(建表时间), update_time(更新时间,设置为自动更新)。
    2. 表名和字段名必须使用小写字母或数字,禁止数字开头,同时使用下划线分割不同的单词,Windows环境下Mysql忽略大小写,Linux下大小写是有区分的,因此为了统一,全部是小写字母加数字,同时命名不能用复数名词,表明和字段名应用来表示含义。
    3. 表示有是否含义的字段时,必须用is_XXX来表示字段名,用tinyint unsigned(1是, 0否),当然也可以使用char(1)来表示'Y'(是), 'N'(否)。
    4. 同时禁止使用MySql保留字段,desc,range等,用过的同学应该知道这个会报错。
    5. 主键的索引名必须为pk_xxx,唯一索引名为uk_xxx,普通索引名为idx_xxx。
    6. 对于数字类型的定义比如bigint(1)与bigint(5)的原理和占用空间都是一样的,不同的长度是不同工具对数字的表形式不同,两者没有任何差别。
    7. 小数类型用decimal来储蓄,尽量根据单位换算用Bigint unsigned等整形来表示,因为MySql小数的运算相比整数消耗资源会更多一点。
    8. char用来表示定长字符,varchar用来储蓄可变字符,根据需求进行字段长度的设置,可以多余,但要适量。
    9. 对于业务上不发生改变的字段设为枚举,在MySql中枚举的储蓄也更加的紧凑,查询的效率也更好点。
    10. 对于需要用有限数字来表示字段信息时,不要用‘0’来表示某种状态,某些情况下JAVA中部分字段的默认值为‘0’,可能会发生一些不必要的错误,正
  2. 索引约束
    1. 业务上唯一的字段,索引必须为唯一索引。比如user_id(假设每个用户只有一个id,若此字段需要建立索引,必须使用唯一索引。
    2. 在varchar字段上建立索引时,索引长度必须指定,根据业务情况的区分度来设置,一半20的区分度为90%。
    3. 建立组合索引时,区分度高的在左边。
    4. 同时,索引的数量单表至多6个,因为索引的维护(频繁的删除和插入操作),会带来比较高的资源消耗,因此不要在频繁删除和更新的字段加索引。
  3. 案列表
    1. CREATE TABLE `product` (
      	`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
      	`uuid` CHAR ( 32 ) NOT NULL COMMENT '产品UUID',
      	`user_uuid` CHAR ( 32 ) NOT NULL COMMENT '用户UUID',
      	`pack_amount` SMALLINT ( 6 ) NOT NULL COMMENT '打包价格\r\n',
      	`term` INT ( 10 ) UNSIGNED NOT NULL COMMENT '借款限期,单位-天',
      	`remark` VARCHAR ( 5 ) DEFAULT '' COMMENT '备注',
      	`product_type` TINYINT ( 4 ) NOT NULL COMMENT '产品类型(1:赚,2:借款,3:转售)',
      	`status` TINYINT ( 4 ) UNSIGNED NOT NULL COMMENT '产品状态',
      	`expend_rate` DECIMAL ( 16, 2 ) NOT NULL COMMENT '利率',
      	`effective_time` datetime NOT NULL COMMENT '标的发布的有效期(时间戳)',
      	`create_time` datetime NOT NULL COMMENT '创建时间',
      	`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      	PRIMARY KEY ( `id` ),
      	UNIQUE KEY `idx_uuid` ( `uuid` ),
      	KEY `idx_user_uuid` ( `user_uuid` ),
              KEY `idx_create_time` ( `create_time` ) 
      ) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8 COMMENT = '产品基础信息表';

       

 

二.优化策略

  1. 字段的选取(最小原则)
    1. 越小的数据类型,通常处理的速度更快,因为占用的磁盘,内存,CPU缓存更少,处理时需要的CPU周期也更短。对于不确定的数值范围,选取最小的可储蓄类型。
数据类型数值范围字节常用场景
tinyint unsigned0-2551表示人的年龄等
smallint unsigned0-655352乌龟年龄等
int unsigned0-42.9亿4恐龙化石时间等
bigint unsigned0-10^198太阳的年龄
char(N)最大为N个字节N对于固定长度的字段(比如人名)
varchar(N)最大为N个字节,N尽量小于255/5000N根据业务需求
datatime1601-9999年8常用的日期储蓄
timestamp1601-9999年4有自动更新机制,update_time
  1. 简单原则
    1. 简单的数据类型需要的CPU周期更短,整形比字符整体的操作代价少很多,建议IP的储蓄用整型。
  2. 尽量避免使用NULL
    1. 通常情况下,字段设置为NOT NULL,NULL为默认属性,对于查询来说有NULL的列,MySql优化很难,查询起来会更麻烦,占用的储蓄空间可更多

三.SQL优化(常用)

  1. 查询优化,在where以及order by 涉及的字段上建立索引。
  2. 避免使用where 属性 = null,这样MySQL会进行全局查询。
  3. 避免在where使用 != 或 < > 等字段。
  4. 避免where 与 or 进行连接查询,使用 union all 进行代替.
  5. 避免使用 in 和 not in 等,连续的范围尽量用between
  6. 避免使用like "%XX%".
  7. 避免where 的字段使用表达式操作.where num/2 = x等
  8. 避免where的字段使用函数操作。
  9. 字段含有大量的相同值比如(sex..),索引的优化没有效果,,MySQL根据字段的内容进行优化,因此进行建立索引;
  10. 索引提高的select 的效率,但降低了insert ,update的效率,建议索引最多建立6个.
  11. 字段的内容如果都为数字的话,避免使用字符作为属性,字符根据每个字符进行比较,数字只会比较一次;
  12. select * from table,尽量使用字段代替 * ,减少查询量,即使需要查询字段也要用全部字段代替 *。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值