tips:如果本文对你有用,请爱心点个赞,提高排名,让这篇文章帮助更多的人。谢谢大家!比心❤~
如果解决不了,可以在文末加我微信,进群交流。

设计规范,在分工协作的工作场景中尤其重要,否则团队之间互相牵制太多,问题多多。
规范设计我想提到如下的几个规范,其实只是属于开发规范的一部分内容,可以作为参考。
规范的本质不是解决问题,而是有效杜绝一些潜在问题,对于千万级大表要遵守的规范,我梳理了如下的一些细则,基本可以涵盖我们常见的一些设计和使用问题,比如表的字段设计不管三七二十一,都是varchar(500),其实是很不规范的一种实现方式,我们来展开说一下这几个规范。

1.配置规范

  • MySQL数据库默认使用InnoDB存储引擎。
  • 保证字符集设置统一,MySQL数据库相关系统、数据库、表的字符集使都用UTF8,应用程序连接、展示等可以设置字符集的地方也都统一设置为UTF8字符集。
    注:UTF8格式是存储不了表情类数据,需要使用UTF8MB4,可在MySQL字符集里面设置。==在8.0中已经默认为UTF8MB4==,可以根据公司的业务情况进行统一或者定制化设置。
  • MySQL数据库的事务隔离级别默认为RR(Repeatable-Read),建议初始化时统一设置为RC(Read-Committed),对于OLTP业务更适合。
  • 数据库中的表要合理规划,控制单表数据量,对于MySQL数据库来说,建议单表记录数控制在2000W以内。
  • MySQL实例下,数据库、表数量尽可能少;数据库一般不超过50个,每个数据库下,数据表数量一般不超过500个(包括分区表)。

建表规范

  • InnoDB禁止使用外键约束,可以通过程序层面保证。
    主键、外键和索引的区别
    ||主键|外键|索引|
    |--|--|--|--|
    |定义|唯一标识一条记录,不能有重复的,不允许为NULL|表的外键是另一表的主键, 外键可以有重复的, 可以是NULL|没有重复值,可以为NULL(会使索引无效)|
    |作用|用来保证数据完整性|用来和其他表建立联系用的|提高查询排序的速度|
    |个数|主键只能有一个|一个表可以有多个外键|一个表可以有多个惟一索引|

  • 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。
  • 整型定义中无需定义显示宽度,比如:使用INT,而不是INT(4)。
  • 不建议使用ENUM类型,可使用TINYINT来代替。
  • 尽可能不使用TEXT、BLOB类型,如果必须使用,建议将过大字段或是不常用的描述型较大字段拆分到其他表中;另外,禁止用数据库存储图片或文件。
  • 存储年时使用YEAR(4),不使用YEAR(2)。
  • 建议字段定义为NOT NULL。
  • 建议DBA提供SQL审核工具,建表规范性需要通过审核工具审核后。

命名规范

  • 库、表、字段全部采用小写。
  • 库名、表名、字段名、索引名称均使用小写字母,并以“_”分割。
  • 库名、表名、字段名建议不超过12个字符。(库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,统一不超过12字符)。
  • 库名、表名、字段名见名知意,不需要添加注释。
    对于对象命名规范的一个简要总结如下表4-1所示,供参考。
    命名列表
对象中文名称 对象英文全称 Mysql对象简称
视图 view view_
函数 function func_
存储过程 procedure proc_
触发器 trigger trig_
普通索引 index idx_
惟一索引 unique index uniq_
主键索引 primary key pk_

索引规范

  • 索引建议命名规则:idx_col1_col2[_colN]、uniq_col1_col2[_colN](如果字段过长建议采用缩写)。
  • 索引中的字段数建议不超过5个。
  • 单张表的索引个数控制在5个以内。
  • InnoDB表一般都建议有主键列,尤其在高可用集群方案中是作为必须项的。
  • 建立复合索引时,优先将选择性高的字段放在前面。
  • UPDATE、DELETE语句需要根据WHERE条件添加索引。
  • 不建议使用%前缀模糊查询,例如LIKE “%weibo”,无法用到索引,会导致全表扫描。
  • 合理利用覆盖索引,例如:
    SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,可以创建覆盖索引idx_uid_email(uid,email)来提高查询效率。
  • 避免在索引字段上使用函数,否则会导致查询时索引失效。
  • 确认索引是否需要变更时要联系DBA。

应用规范

  • 避免使用存储过程、触发器、自定义函数等,容易将业务逻辑和DB耦合在一起,后期做分布式方案时会成为瓶颈。
  • 考虑使用UNION ALL,减少使用UNION,因为UNION ALL不去重,而少了排序操作,速度相对比UNION要快,如果没有去重的需求,优先使用UNION ALL。
  • 考虑使用limit N,少用limit M,N,特别是大表或M比较大的时候。
  • 减少或避免排序,如:group by语句中如果不需要排序,可以增加order by null。
  • 统计表中记录数时使用COUNT(),而不是COUNT(primary_key)和COUNT(1);InnoDB表避免使用COUNT()操作,计数统计实时要求较强可以使用Memcache或者Redis,非实时统计可以使用单独统计表,定时更新。
  • 做字段变更操作(modify column/change column)的时候必须加上原有的注释属性,否则修改后,注释会丢失。
  • 使用prepared statement可以提高性能并且避免SQL注入。
  • SQL语句中IN包含的值不应过多。
  • UPDATE、DELETE语句一定要有明确的WHERE条件。
  • WHERE条件中的字段值需要符合该字段的数据类型,避免MySQL进行隐式类型转化。
  • SELECT、INSERT语句必须显式的指明字段名称,禁止使用SELECT * 或是INSERT INTO table_name values()。
  • INSERT语句使用batch提交(INSERT INTO table_name VALUES(),(),()……),values的个数不应过多。

关于mysql数据库涉及的一些规范的更多相关文章

  1. MySQL数据库设计与开发规范

    目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...

  2. MySQL数据库SQL修改数据规范

    start transaction; select id,rname,free_course_ph,cmp_id,free_date_limit_ph from ebk_students WHERE ...

  3. mysql 数据库设计规范

    MySQL数据库设计规范 目录 1. 规范背景与目的 2. 设计规范 2.1 数据库设计 2.1.1 库名 2.1.2 表结构 2.1.3 列数据类型优化 2.1.4 索引设计 2.1.5 分库分表. ...

  4. JSON文件存入MySQL数据库

    目标:将不同格式的JSON文件存入MySQL数据库 涉及的点有: 1. java处理JSON对象,直接见源码. 2. java.sql.SQLException: Incorrect string v ...

  5. MySQL数据库高可用方案

    一.什么是高可用性: 高可用性=可靠性,它的本质就是通过技术和工具提高可靠性,尽可能长时间保持数据可用和系统运行,实现高可用性的原则,首先要消除单点故障,其次通过冗余机制实现快速恢复,还有就是实现容错 ...

  6. MySQL数据库开发规范知识点

    前言: 设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一. 约定优先于配置(Convention Over Configuration ...

  7. MySQL数据库规范

    Mysql数据库规范 一.基础规范 [强制]使用InnoDB存储引擎解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高[强制] ...

  8. MySQL数据库基本规范整理

    此篇文章是学习MySQL技术整理的,不足之处还望指教,不胜感激. 数据库基本规范涉及数据库命名规范.数据库索引设计规范.数据库基本设计规范.数据库字段设计规范.数据库SQL开发规范.数据库操作行为规范 ...

  9. mysql 数据库 规范

    目录 mysql 数据库 规范 基础规范 命名规范 表设计规范 字段设计规范 索引设计规范 SQL编写规范 行为规范 mysql 数据库 规范 基础规范 必须使用InnoDB存储引擎 解读:支持事务. ...

随机推荐

  1. Pandas | 10 排序

    Pandas有两种排序方式,它们分别是 - 按标签 按实际值 import pandas as pd import numpy as np df=pd.DataFrame(np.random.rand ...

  2. TensorFlow实现文本情感分析详解

    http://c.biancheng.net/view/1938.html 前面我们介绍了如何将卷积网络应用于图像.本节将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句 ...

  3. LaTeX表格紧跟文字 (不影响下方文本对齐)

    很多博客会让你用下面这行替换\\begin{table}和\\end{table},但是这样替换以后,表格下方所有文字都变成了居中对齐,section格式也都失效了. \makeatletter\de ...

  4. Hbase安装使用

    启动Hadoop 启动Hbase jps 进入shell 建立表及使用

  5. SpringMVC之使用ResponseEntity

    1.Post请求 一般情况下,在非必须的情况下,使用Jquery实现post请求,而后台返回一般都需要手动封装ResponseUtil,和使用@ResponseBody注解来实现返回.然而我们书上学到 ...

  6. 关于Linux TCP "SACK PANIC" 远程拒绝服务漏洞的修复

    Linux 内核被曝存在TCP "SACK PANIC" 远程拒绝服务漏洞(漏洞编号:CVE-2019-11477,CVE-2019-11478,CVE-2019-11479),攻 ...

  7. Linux之三剑客

    LINUX之三剑客 本篇主要介绍linux下常用的增删改查工具: grep sed awk grep是linux下一个强大的搜索工具,几乎操作linux的用户每天都会或多或少的用到grep命令,单一个 ...

  8. 腾讯云IPv6技术拿了个一等奖!1.5亿人已经用上

    中国通信学会在其官网上公布了2019年中国通信学会科学技术奖的评选结果,腾讯云和中国移动通信集团,中国信息通信研究院.以及华为联合申报的“移动互联网IPv6技术攻关及规模应用”项目荣获今年科学技术一等 ...

  9. json对象与string相互转换教程

    一.说明 1.1 背景说明 json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了.但今天又被string转json对象折腾了半天,实在受不了,所以还是 ...

  10. 概率dp - Uva 10900 So you want to be a 2n-aire?

    So you want to be a 2n-aire? Problem's Link Mean: 玩一个答题赢奖金的游戏,一开始有1块钱,玩n次,每次赢的概率为t~1之间的某个实数. 给定n和t,求 ...