首页 数据库 MySQL查询建表规范

MySQL查询建表规范

因为之前一直再查找一些比较好的数据库规范,以方便在开发时连接 MySQL 进行查询/建表的时候,能根据规范来执行,达到提高 查询速度 / 执行 SQL 的性能 和提升 MySQL 的整体性能, 这里主要是存放一些比较好的一些数据库设计规范(主要用了公司某位同事整理的数据库规范,已得到该大佬的授权),我在此基础上增补了部分规则。
1. 基本规范
使用 innodb 存储引擎 后续使用 TokuDB 存储引擎
表字符集使用 UTF8mb4
所有表和表字段必须添加备注,表备注格式为:创建人,创建时间,表的业务说明
所有表必须添加主键和自增 id,自增列无业务意义也需添加
生产 mysql 数据库不允许存储图片和文件等大数据
禁止在线上数据库进行压力测试
数据量较大的表建议建分区表
禁止使用外键 允许逻辑意义上的外键依赖
能用代理账号链接数据库的尽量使用代理账号链接,方便运维那边以后做数据库迁移工作
如果只涉及到查询操作的,使用只查权限的账号建立链接,例如:Superset 等bi系统建立报表的查询
一般情况下线上业务使用的数据库账号为写的账号,因为线上业务一般不涉及到对字段/表定义更改操作,管理权限权限账号一般只用于自己开发本地连接
申请/创建 数据库的时候一般使用主主配置即可,即一个库作为写主库,一个库作为读主库
修改测试库 ddl 级别的 需要提交脚本至升级文档 升级时一起执行脚本 确保测试库和正式库统一
2. 命名规范
表名建议带上业务英文名的,第一个字母 +"_" 开头,例如:data_service 业务,表名应该都是以 d_开头,控制在 15 个字符以内
表名字符禁止超过 32 个字符
库名、表名、字段名禁止使用 MySQL 保留字
临时库、表名必须以 tmp 为前缀,并以日期为后缀
备份库、表必须以 bak 为前缀,并以日期为后缀
操作日志类型的库、表建议以log为后缀
普通索引命名:idx_开头 + 字段名(单阶字段用全字段名,双阶或者三阶使用前阶首字母加最后阶的全拼,例如:create_time 索引命名为:idx_ctime)
唯一索引命名:uniq_开头 + 字段名 方法参考二级索引命名
3. 数据表设计规范
自增 id 必须添加 unsigned
字段设置 not null 的必须有默认值
少用 text 类型,尽可能改用 varchar,禁止使用 blob 类型,实在避免不了 blob,请拆表
存储非负整数需添加 unsigned
禁止使用 FLOAT 和 DOUBLE 存储浮点数,改用 DECIMAL 存储
尽可能不使用 default null,非必要使用 null,建议改用 default 0 或 default '' (以免使用查询时候null 值情况查询需要另外处理),同时也不建议使用 default ''
所有 type 和 status 等业务字段使用 TINYINT 类型,禁止使用 varchar,避免不了 varchar 的情况下则使用 enum 类型
使用 datetime 存储时间(mysql5.6 以后)
用好数值类型字段,如果数值字段没那么大,就不要用 bigint
禁止在数据库中存储明文密码,把密码加密后存储
能使用分区表尽量使用分区表
表设计前必须评估字段的字长,避免没必要的空间浪费和性能损耗
建议单表字段数控制在 20 个以内,再多建议垂直分表
外键约束一般不在数据库上创建,只表达一个逻辑的概念,由程序控制
所有表必须有 create_time 和 update_time,并添加触发器(CURRENT_TIMESTAMP 和 CURRENT_TIMESTAMP ON UPDATE)
四。索引规范
表必须有主键(聚集索引)
不使用 UUID MD5 HASH 这些作为主键 (数值太离散)
默认使非空的唯一键作为主键
一般自增列为主键,分区表的分区键可以与自增列做复合索引
单索引字段数不超过 5 个
优先考虑覆盖索引
避免冗余和重复索引
避免使用基数低的字段做索引,例如:性别、类型、状态
低基数字段建议根据 where 谓词条件建立复合索引
ORDER BY、GROUP BY、DISTINCT、WHERE 后字段需根据实际情况建立索引
索引字段的默认值不能为 NULL
能使用唯一索引就要使用唯一索引,但要求是字长不能超 8 位和不离散的字段,超 8 位的和离散字段,使用前缀索引
5. SQL 开发规范
代码中禁止使用 select *
不使用标量子查询,尽可能改外连接
表关联控制在 3 个表内
表关联字段尽可能使用主键
禁止大表做子查询
表关联排序字段必须在驱动表内
表关联字段必须有索引
不使用标量子查询,尽可能改为 left join 或者 right join
不使用 in/not in/exists/not exists 子查询,尽可能改为 inner join
禁止大表与大表做 join
OR 改写为 IN () 或者 UNION
使用 union all 替代 union
分页需改写为如下:select id,text from test limit 10000,10; --> select b.id,b.text from (select id from test a limit 10000,10) left join test b on a.id=b.id
不建议使用前缀是 % 的 like(无法使用索引)
不建议 where 条件里 in (子查询),即使 in 的是索引字段
6. 建表实例
1_ddl_新建 demo 表.sql

CREATE TABLE `c_demo` (
`id` bigint (11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar (50) NOT NULL default '' COMMENT ' 名称 ',
`creator` varchar (50) NOT NULL default '' COMMENT ' 创建者 ',
`is_deleted` tinyint (2) NOT NULL DEFAULT '0' COMMENT ' 是否逻辑删除 0. 否 1. 是 ',
`create_time` datetime NOT NULL DEFAULT '2020-01-13 00:00:00' COMMENT ' 创建时间 ', -- 这里是为了兼容MySQL 5.6 之前的版本,5.6 之前的版本不能同时建两个 带有 CURRENT_TIMESTAMP 触发的字段
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ' 更新时间 ', PRIMARY KEY (`id`),
KEY `idx_name_deleted` (`name`,`is_deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT

站心网

因为之前一直再查找一些比较好的数据库规范,以方便在开发时连接 MySQL 进行查询/建表的时候,能根据规范来..

为您推荐

服务器安装数据库MySQL8.0版本,打包导入到MySQL5.6失败的结局方式

最近数据库升级为mysql8.0,在使用过程中发现一些问题,首先mysql8.0有很多新特性,对服务器配置要求较高,所有就考虑把数据库版本切换到MySQL5.6,经过多出测试处理发现在8.0数据库打包的数据导入到5.6总是报错,或..

必须掌握的MySQL优化指南(2)

4|0表分区MySQL 在 5.1 版引入的分区是一种简单的水平拆分,用户需要在建表的时候加上分区参数,对应用是透明的无需修改代码。对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实..

mysql分表简单介绍

一、Mysql分表的原因1、当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会停在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。2、mysql中有一种机制是表锁定..

MySQL创建用户与授权

一, 创建用户: 命令:CREATE USER'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, ..

必须掌握的MySQL优化指南(1)

1.单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度。一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时..

Mysql查询的一些操作(查表名,查字段名,查当月,查一周,查当天)

查询数据库中所有表名select table_name from information_schema.tables where table_schema='tools' and table_type='base table';查询指定数据库中指定表的所有字段名column_nameselect column_n..

MySQL查看、修改字符集及Collation

前言在使用MySQL的过程中,可能会出现初始设计使用的字符集或Collation不符合当前需求的情况。如使用utf8的表(MySQL中的utf8即utf8mb3)要支持emoji,而utf8mb3不支持emoji(emoji需要4个字节,而utf8mb3最长只支持..

MySQL SQL调优之索引

本篇记录MySQL的索引知识学习笔记,也方便自己以后查找复习一、索引的概念MySQL官方给出的索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构。所以说索引就是排好序的快速查找数据结构二、索引分类MySQL的索..

mysql随机获取一条或者多条数据

语句一:select * from users order by rand() LIMIT 1MYSQL手册里面针对RAND()的提示大概意思就是,在 ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低,效率不行,切..

Mysql子查询

子查询出现在select语句中的select语句,称为子查询或内查询。外部的select查询语句,称为主查询或外查询。子查询分类按结果集的行列数不同分为4种标量子查询(结果集只有一行一列)列子查询(结果集只有一列多行)..

MySQL批量插入的分析

1、背景我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不同的情况选择不同的策略。只要了解sql,就应该知道,向table中插入数据的命令,至少有insert和replace这两种,使用哪一种命令,和..

Mysql查询一段时间内的数据

select * from wap_content where week(created_at) = week(now)如果你要严格要求是某一年的,那可以这样查询一天:select * from table where to_days(column_time) = to_days(now());select * from table where da..

MySQL 5.x和MySQL 8.x数据库的区别

MySQL 是开源关系型数据库的代表,广泛应用于不同规模的 Web 和企业应用中。从 MySQL 5.x 到 MySQL 8.x 的升级带来了大量功能改进和性能提升。为了帮助大家更直观地理解两者的区别,本文将通过详细介绍并结合实际的 ..

宝塔里mysql停止了自动启用脚本

mysql突然停止的原因有多种,这里不列举,可以排查具体原因。如果停止后,还可以手工正常启用mysql,那可以考虑把shell脚本添加到宝塔的计划任务里,定时每隔几分钟检测一次,让mysql自动检测停止后立马启用。ps=`ps..

MySQL如何建数据库

MySQL是一款非常流行的关系型数据库管理系统。无论是在企业还是个人项目中,都经常使用MySQL数据库。在使用MySQL之前,需要先创建一个数据库。本文将介绍如何建立MySQL数据库。一、安装MySQL在开始建立MySQL数据库之..

mysql怎么随机查询数据

MySQL是一种广泛使用的关系型数据库管理系统,在进行数据查询时,随机查询数据是一项很有用的技能。以下是一些方法和技巧,可以帮助你使用MySQL在数据中进行随机查询。方法一:使用RAND()函数进行随机排序RAND()函数..

数据库系列:MySQL引擎MyISAM和InnoDB的比较

1 比较和分析MyISAM和InnoDB是两种不同的数据库存储引擎,它们在数据存储结构、事务支持、锁的支持、外键支持、主键观念、性能和优化方式等方面都存在明显的差异。数据存储结构:MyISAM在磁盘上存储了三个文件,包括..

使用docker搭建Nginx + PHP + mysql环境

Nginx+PHP+Mysql是比较常用的网站环境,使用docker布置网站环境也是比较常用的方式,以下就给大家介绍如果使用docker来搭建Nginx+PHP+Mysql的运行环境。前提准备:macOs环境、docker环境(安装docker可以百度,对mac..

.NET EF连接MySQL数据库

.NET EF是Microsoft提供的ORM框架,可以简化.NET程序员与数据库的交互。要使用EF连接MySQL数据库,需要安装以下NuGet包:Microsoft.EntityFrameworkCore.MySqlPomelo.EntityFrameworkCore.MySql安装完成后,就可以配..

mysql中文乱码解决方法

安装mysql之后,如果存储中文,再读出的时候就会出现乱码问题。现在的字符集有几百种之多,都是一些公司或者组织定义的。我们应该使用能够容纳世界全部语言全部字符的字符集,这样就不会再出现乱码问题。这就是现在..

发表回复

返回顶部