一、基础规范

  • 表存储引擎必须使用InnoDB

  • 表字符集默认使用utf8,必要时候使用utf8mb4

解读:

(1)通用,无乱码风险,汉字3字节,英文1字节

(2)utf8mb4是utf8的超集,有存储4字节例如表情符号时,使用它

  • 禁止使用存储过程,视图,触发器,Event

解读:

(1)对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层

(2)调试,排错,迁移都比较困难,扩展性较差

  • 禁止在数据库中存储大文件,例如照片,可以将大文件存储在对象存储系统,数据库中存储路径

  • 禁止在线上环境做数据库压力测试

  • 测试,开发,线上数据库环境必须隔离

二、命名规范

  • 库名,表名,列名必须用小写,采用下划线分隔

解读:abc,Abc,ABC都是给自己埋坑

  • 库名,表名,列名必须见名知义,长度不要超过32字符

解读:tmp,wushan谁TM知道这些库是干嘛的

  • 库备份必须以bak为前缀,以日期为后缀

  • 从库必须以-s为后缀

  • 备库必须以-ss为后缀

三、表设计规范

 

潜在坑:删除无主键的表,如果是row模式的主从架构,从库会挂住

  • 禁止使用外键,如果要保证完整性,应由应用程式实现

解读:外键使得表之间相互耦合,影响update/delete等SQL性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈

  • 建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据

四、列设计规范

 

  • 根据业务区分使用tinyint/int/bigint,分别会占用1/4/8字节

  • 根据业务区分使用char/varchar

解读:

(1)字段长度固定,或者长度近似的业务场景,适合使用char,能够减少碎片,查询性能高

(2)字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间

  • 根据业务区分使用datetime/timestamp

    注意事项: 可以参考这篇文章:https://blog.51cto.com/hanchaohan/1751447

解读:前者占用5个字节,后者占用4个字节,存储年使用YEAR,存储日期使用DATE,存储时间使用datetime

解读:

(1)NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化

(2)NULL需要更多的存储空间

(3)NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in时有大坑

  • 使用INT UNSIGNED存储IPv4,不要用char(15)

解读:

(1)如果用CHAR(15)来存储,则需要15个字节(VARCHAR则需要16个字节)。将IP用无符号整数存储,只需要4个字节,能节约空间。

(2)对于范围查找效率更高

   SELECT * FROM test_han WHERE ip BETWEEN INET_ATON('192.168.0.0') AND INET_ATON('192.168.0.255');

 

(3)SELECT * FROM test_han WHERE ip = INET_ATON('192.168.0.0');

   SELECT INET_ATON('192.168.0.0');

   SELECT INET_NTOA(3232235520);

可以参考一下这篇文章:http://www.voidcn.com/article/p-dnqfznsx-mc.html

  • 使用varchar(20)存储手机号,不要使用整数

解读:

(1)牵扯到国家代号,可能出现+/-/()等字符,例如+86

(2)手机号不会用来做数学运算

(3)varchar可以模糊查询,例如like ‘138%’

  • 使用TINYINT来代替ENUM

解读:ENUM增加新值要进行DDL操作

五、索引规范

 

解读:

(1)互联网高并发业务,太多索引会影响写性能

(2)生成执行计划时,如果索引太多,会降低性能,并可能导致MySQL选择不到最优索引

(3)异常复杂的查询需求,可以选择ES等更为适合的方式存储

  • 组合索引字段数不建议超过5个

解读:如果5个字段还不能极大缩小row范围,八成是设计有问题

  • 不建议在频繁更新的字段上建立索引

  • 非必要不要进行JOIN查询,如果要进行JOIN查询,被JOIN的字段必须类型相同,并建立索引

解读:踩过因为JOIN字段类型不一致,而导致全表扫描的坑么?

  • 理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)

六、SQL规范

 

  • 禁止使用select *,只获取必要字段

解读:

(1)select *会增加cpu/io/内存/带宽的消耗

(2)指定字段能有效利用索引覆盖

(3)指定字段查询,在表结构变更时,能保证对应用程序无影响

  • insert必须指定字段,禁止使用insert into T values()

解读:指定字段插入,在表结构变更时,能保证对应用程序无影响

  • 隐式类型转换会使索引失效,导致全表扫描

  • 禁止在where条件列使用函数或者表达式

解读:导致不能命中索引,全表扫描

  • 禁止负向查询以及%开头的模糊查询

解读:导致不能命中索引,全表扫描

  • 禁止大表JOIN和子查询

  • 同一个字段上的OR必须改写问IN,IN的值必须少于50个

  • 应用程序必须捕获SQL异常

解读:方便定位线上问题

说明:上面建议用于并发量大,数据量大的典型互联网业务

转载自:https://blog.51cto.com/hanchaohan/2357489

MySQL互联网业务使用建议的更多相关文章

  1. 为互联网业务而生:阿里云全球首发云Cassandra服务!

    引言:十年沉淀.全球宽表排名第一.阿里云首发云Cassandra服务 ApsaraDB for Cassandra是基于开源Apache Cassandra,融合阿里云数据库DBaaS能力的分布式No ...

  2. 优化MySQL的21个建议 – MySQL Life【转】

    今天一个朋友向我咨询怎么去优化 MySQL,我按着思维整理了一下,大概粗的可以分为21个方向. 还有一些细节东西(table cache, 表设计,索引设计,程序端缓存之类的)先不列了,对一个系统,初 ...

  3. 阿里聚安全受邀参加SFDC安全大会,分享互联网业务面临问题和安全创新实践

    现今,技术引领的商业变革已无缝渗透入我们的日常生活,「技术改变生活」的开发者们被推向了创新浪潮的顶端.国内知名的开发者技术社区 SegmentFault 至今已有四年多了,自技术问答开始,他们已经发展 ...

  4. 什么是业务运维,企业如何实现互联网+业务与IT的融合

    业务运维并不是一个新概念,针对传统信息架构提出的业务服务管理就是把以业务为核心的IT系统与IT基础设施性能进行整合运维的解决方案.然而随着互联网+转型的不断推进,基础设施的智能化和广泛云化成为IT发展 ...

  5. HBase在共享经济互联网业务的应用

    HDFS 与 Hbase HDFS容错率很高,即便是在系统崩溃的情况下,也能够在节点之间快速传输数据.HBase是非关系数据库,是开源的Not-Only-SQL数据库,它的运行建立在Hadoop上.H ...

  6. 【Docker】 .Net Core 3.1 webapi 集成EF Code First,使用MySql进行业务操作 、配置swagger (三)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  7. MySQL数据库优化小建议

    背景 “那啥,你过来一下!” “怎么了?我代码都单元测试了的,没出问题啊!”我一脸懵逼跑到运维大佬旁边. “你看看!你看看!多少条报警,赶快优化一下!”运维大佬短信列表里面好多MySQL CPU 10 ...

  8. Mysql使用规范及建议

    MySQL数据库使用规范一.建表规约1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否) 说明:任何字段如果为非负数,必 ...

  9. MySQL 福利彩票业务 如何存储毫秒微秒

    朋友在做福利彩票业务,遇到一个存储毫秒微秒数据的需求,问我mysql里面有何解决方案.我脑中一搜索,以前没有关注到,于是去官网查看,找到11.3.6 Fractional Seconds in Tim ...

随机推荐

  1. SpringBoot常用配置,引入外部配置文件信息,热加载

    SpringBoot的配置文件格式 yml规范 SpringBoot的配置文件支持properties和yml,甚至还支持json. 更推荐使用yml文件格式: yml文件,会根据换行和缩进帮助咱们管 ...

  2. Visual Studio安装

    2017 安装的时候,一直显示,安装成功但是有告警. 解决方法: 将visual studio 2017 installer进行卸载,然后安装hw的ios 不能确保下次也可以成功

  3. 如何使 pdf 文件在浏览器里面直接下载而不是打开

    前言 在做需求过程中我们大概率会遇到在浏览器中下载文件的需求,如果仅仅是这个要求的话很简单,有如下两种解决方式. 第一种是通过 window 对象的 open 方法进行操作,将文件 url 直接在浏览 ...

  4. 解决 EntityFrameworkCore tool 3.1 init.ps1 is not recognized 问题

    昨天将项目升级到.net core 3.1后, 打开vs2019 Package Manager Console后突然发生了错误,如下 最终导致EntityFramework 迁移相关命令都不能正常使 ...

  5. Java基于SSM的个人博客系统(源码 包含前后台)

    @ 目录 系统简介 系统运行截图 核心代码 写在最后 系统简介 技术点:Java.JSP.SSM框架,实现了个人博客系统 用户角色分为:普通用户.管理员.系统管理员 功能:发博客.博客分类.博客删除. ...

  6. C#实践设计模式原则SOLID

    理论跟实践的关系,说远不远,说近不近.能不能把理论用到实践上,还真不好说.   通常讲到设计模式,一个最通用的原则是SOLID: S - Single Responsibility Principle ...

  7. springboot-遇到的错误

    1.Field userMapper in com.yanan.outjob.controller.SysUserController required a bean of type 'com.yan ...

  8. hbase运行流程图

    hbase运行流程图

  9. anaconda下载包时网络连接错误的解决方法(CondaHTTPError:HTTP 000 connection failed for url)

    继上一篇<在WSL上搭载python编程环境>之后,下载软件和创建新环境的过程非常艰辛,下载太慢,以至于常常中断. 不论用conda安装一些python的包,还是创新独立的编程环境时,出现 ...

  10. SpringBoot输出日志到文件

    1 基本信息 SpringBoot版本2.2.5 日志框架SLF4J 日志框架的实现LockBack 2 输出文件的配置 2.1 logging.file.name 指定日志文件的位置. 2.1.1 ...