美文网首页Mysql
Mysql standard

Mysql standard

作者: simok | 来源:发表于2019-12-19 18:27 被阅读0次
    • 建表

    【推荐】表的全名最好是遵循"业务名称_表的作用"。
    
    【推荐】库名与应用名称尽量一致。
    
    【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
    
    【强制】表名不使用复数名词,尽量做到见名知意。
    
    【强制】表必备三字段:gid, created_at, updated_at。
    
    说明:其中gid 必为主键,类型为bigint unsigned或int unsigned、单表自增、步长为1。created_at的类型为datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at的类型为datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
    
    【强制】禁用保留字,如desc、range、match、delayed等,请参考MySQL官方保留字。
    
    【强制】小数类型为decimal,禁止使用float和double。
    
    【强制】主键索引名为pk_字段名;唯一索引名为uk_字段名[_字段名];普通索引名则为idx_字段名[_字段名]。
    
    【强制】外键约束不在数据库上创建,只表达一个逻辑的概念,由程序控制。
    
    【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
    
    【推荐】如果修改字段含义或对字段表示的状态追加时 ,需要及时更新字段注释。
    
    【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:
    
    不是频繁修改的字段
    不是varchar超长字段,更不能是text字段
    不是唯一索引的字段
    【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
    
    【参考】存日期使用DATE类型。
    
    【参考】逻辑主键(自增主键)不用作业务主键,需另定义一个业务主键。
    
    【参考】默认使用utf8mb4字符集,数据库排序规则使用utf8mb4_general_ci
    
    二、索引
    【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
    
    【强制】超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。
    
    【强制】在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
    
    【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
    
    【推荐】建组合索引的时候,区分度最高的在最左边。
    
    【推荐】防止因字段类型不同造成的隐式转换,导致索引失效。
    
    【推荐】关联其它表的外键字段必须要创建索引。
    
    【推荐】单张表的索引控制在5个以内,索引中的字段数不超过5个。
    
    【推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合 索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。
    
        正例:where a=? and b=? order by c; 索引:a_b_c
    
        反例:索引如果存在范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 无法排序。
    
    
    
    【推荐】利用覆盖索引来进行查询操作,避免回表。
    
    • 索引

    【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。
    
    【强制】超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。
    
    【强制】在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
    
    【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
    
    【推荐】建组合索引的时候,区分度最高的在最左边。
    
    【推荐】防止因字段类型不同造成的隐式转换,导致索引失效。
    
    【推荐】关联其它表的外键字段必须要创建索引。
    
    【推荐】单张表的索引控制在5个以内,索引中的字段数不超过5个。
    
    【推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合 索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。
    
        正例:where a=? and b=? order by c; 索引:a_b_c
    
        反例:索引如果存在范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 无法排序。
    
    
    
    【推荐】利用覆盖索引来进行查询操作,避免回表。
    
    • 习惯

    禁止使用select *, * 用所需字段代替
    禁止使用select for update
    禁止在where条件的列名上使用函数
    禁止使用子查询
    update/delete只能单表操作,不允许多表关联,不允许子查询,且一定要带where条件
    insert语句要显式指定插入的列名,且不允许使用insert...select的形式
    禁止使用存储过程、存储函数、触发器、视图
    避免使用or,用union代替
    尽量不要在数据库里做运算
    尽量不要做%前缀模糊查询,如like '%name'
    不要使用大偏移量的limit分页
    批量insert语句最好采用bulk insert的方法,如insert into table(***) values(***),(***),每个批次以执行时间小于1秒为原则
    update/delete尽量根据主键进行操作
    尽量减少count()的使用,尤其是用来频繁获取全表记录数
    使用group by时,如无排序的需求,建议加order by null
    join中使用的关联字段使用统一的数据类型
    尽量不要在查询语句中指定强制索引force index
    需要格外注意的场景
    没有where条件的sql
    使用count(*)
    使用like
    使用text字段
    多语句事务
    
    use test;
    CREATE TABLE `test`.`user` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(32)  NOT NULL DEFAULT '0' COMMENT '账号',
      `password` varchar(32) NOT NULL COMMENT '密码',
      `email` varchar(32) NOT NULL COMMENT '邮箱',
      `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    CREATE TABLE `test`.`threads` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `user_id` varchar(32)  NOT NULL DEFAULT '0' COMMENT '用户ID',
      `topic` text COMMENT '帖子',
      `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    
    
    CREATE TABLE `test`.`posts` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `user_id` varchar(32)  NOT NULL DEFAULT '0' COMMENT '用户ID',
      `threads_id` varchar(32)  NOT NULL DEFAULT '0' COMMENT '帖子ID',
      `body` text COMMENT '密码',
      `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    

    相关文章

      网友评论

        本文标题:Mysql standard

        本文链接:https://www.haomeiwen.com/subject/hjlvnctx.html