一、数据库设计

1、表结构设计

 -表中的自增列(auto_increment属性)推荐使用bigint类型
-首选使用非空的唯一键, 其次选择自增列或发号器
不使用更新频繁的列,尽量不选择字符串列,不使用UUID MD5 HASH
-业务中选择性很少的状态status、类型type等字段推荐使用tinytint或者smallint类型
-业务中IP地址字段推荐使用int类型
-业务活跃的大表中必须有行数据的创建时间字段create_time和最后更新时间字段update_time
-表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值
-用decimal存储精确浮点数(不要用浮点类型)
-不推荐使用enum,set,blob,text等类型,对于大表必须将text、blob等类型字段拆分或者独立建表

2、索引设计

 -避免冗余索引 :避免将同一个字段都建立索引,索引的建立需要根据访问的SQL语句来评估
-一次查询,一个表只能用到一个索引,不要对每个查询条件的字段都单独建立索引
-单张表索引数量不超过7,单个索引字段数不超过5
-不在null列上加索引
-不在低基数列上建立索引,例如“性别”
-复合索引字段排序,区分度最大的字段放在前面
-核心SQL优先考虑覆盖索引
-对字符串使用前缀索引
-前缀长度不超过8个字符 ,必须是最左前缀

3、字符集及校验集

 -数据库和表的字符集必须一致,且所有表的字符集必须一致,只能是utf8;数据库中所有表采用统一的校验集
-主、从数据库的字符集必须一致
-前端程序字符集或者环境变量中的字符集,与数据库、表的字符集必须一致

4、其他要求

 -不推荐使用外键,临时表,视图,自定义函数,存储过程以及触发器
-SSD硬盘上,单表数据行数不能超过5000万或者存储空间不得大于30GB
-SAS硬盘上,单表数据行数不能超过2000万或者存储空间不得大于15GB
-上线前DBA必须根据1年内的业务访问量和数据增长量,给出库、表的扩展方案


二、SQL编写

1、select

 -SELECT语句必须指定具体字段名称,禁止写成“select *”
-SELECT语句禁止使用UNION,推荐使用UNION ALL,并且UNION子句个数限制在5个以内

2、DML

 -INSERT语句必须指定具体的字段名称,不要写成INSERT VALUES(……)形式
-SQL语句在程序中传入的参数值类型必须与字段在数据库中的类型相同

3、多表联合查询

 -多表连接查询推荐使用别名,且SELECT列表中要用别名引用字段,数据库.表格式,如“select a.cid  from iknow_qb. tblreply a where …”
-生产系统中,单个查询中不推荐将3张表以上(包括3张表)做连接
-生产系统中,强烈不推荐使用外关联,包括左外关联,右外关联和全外关联
-在多表连接的查询中,驱动表须要选择结果集较小的表
-禁止写成多层子查询嵌套的SQL语句,推荐改写成表顺序连接的格式
-尽量不要在INSERT|UPDATE|DELETE|REPLACE语句中进行多表连接操作

4、事务

 -事务中INSERT|UPDATE|DELETE|REPLACE语句操作的行数控制在2000,以及WHERE子句中IN列表的传参个数控制在2000
-批量操作数据时,需要控制事务处理间隔时间,进行必要的sleep,具体值由DBA给出,并且程序必须有中断处理能力
-对于有auto_increment属性字段的表的插入操作,并发需要控制在200/s以内
-SQL级别/事务级别/主从数据库中的表存储引擎类型要一致,存储引擎混合使用会导致主从数据不一致或主从同步中断
-对于同步延迟不敏感的只读查询,必须放到从库上执行;对于同步延迟敏感的只读查询,可以放到主库上执行
-前端程序中尽量不要使用set语句,包括set names、set sql_mode和set isolation_level等

5、表扫描方式:

 -SELECT|UPDATE|DELETE|REPLACE要有WHERE子句,且WHERE子句的条件必需使用索引查找
-生产数据库中强烈不推荐大表上发生全表扫描,但对于5000行以下的静态表可以全表扫描
-业务中大表全表扫描和全表导出(dump)推荐放在备份库或者线下读库中进行
-WHERE 子句中禁止只使用全模糊的LIKE条件进行查找(如like '%aj%'),必须有其他查询条件
-WHERE子句中的索引列或组合索引前导列上不能使用函数

6、排序和分组

 -有distinct、order by和group by子句的查询,中间结果集限制10000行以内
-对于大结果集(中间结果集超过10000行)的排序、分组放到程序端实现

7、其他要求

 -单个SQL语句的大小限制在5MB以内
-生产数据库中SQL语句的中间结果集和最终结果集必须限制在5MB以内
-生产数据库中SQL语句禁止使用提示,如force index,ignore index,straight_join,sql_no_cache等
-禁止使用全文检索功能
-禁止使用事件(EVENT)功能
-程序中不要使用或操作mysql库和test库,禁止创建test或以test开头的库
-禁止在mysql中使用用户自定义变量
-线上数据库中不要进行业务的实时统计或者汇总等计算操作,可导出后利用其它工具或者在线下备份库中完成
-减少与数据库的交互次数
INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),()
UPDATE … WHERE ID IN(A,B,C,…)
-不使用负向查询,例如 not in,!= ,not like
-不在索引列进行数学运算和函数运算
-不使用%前导的查询,例如like “%abc”
-避免大表数据类型间的隐式转换(这个经常出性能问题)会导致索引失效,例如数字转字符串


三、MySQL相关特点介绍

1、MySQL对SQL的处理特点

 -SQL请求处理只能使用一个核
-没有SQL编译缓存,SQL存储过程都是硬解析
-索引上不支持运算对比
-大多情况下一个Query只能使用一个索引
-不支持Hash jion(MariaDB目前支持)
-基于线程的对外服务模型(连接数太高,性能下降严重)
-子查询支持较差,外层查询一般走不了索引

2、MySQL支持的存储大小

 -单个表空间64T, 每个表只有一个表空间,也就是每个单表最大64T
-Innodb Logfile 加起来不能超过512G
-每行大小限制65535 byte
-每个表最多1027个字段
-每个表最多64个普通索引

3、MySQL生产参考指标

 -单实例最好不要超过1T, 周边LOG除外,最大不建议超过5T
-一般的OLTP单表建议最大不要超过10G
-通常在有buffer命中的情况下:
Select 可以达到3-6W/S
Insert 在聚集索引连续的情况可以到2w-3W/S
在聚集索引不连续的情况下有可能也就是200-300/S
UPDATE数据在内存的情况下可以达到3K/S
DELETE数据在内存的情况下可以达到1k/s,有可能更少
-数据库的瓶颈: IO能力 ,想办法用顺序IO,减少随机IO


四、建表审核


五、容量评估

1、容量评估概述
        
所有的数据库上线:新建集群、新建数据库、新建表,都需要提前进行容量评估,防止后续因容量问题而又对已上线的业务进行调整、扩容、迁移等操作,从而对线上业务造成影响。容量包括:访问量(读写)、数据及增长量、磁盘空间容量.

2、表容量
        
表容量主要从表的 记录数、平均长度、增长量、读写量、总大小量进行评估。一般对于OLTP的表,建议单表不要超过2000W行数据量,总大小15G以内。访问量:单表读写量在1600/s以内。
        对于单表数据量上百万的表,每行记录长度不要过长,不要和text、blob等字段类型放在同一个表中。(MySQL数据页大小为16K,每行记录越长,每个数据页存储的记录数就越少,因此在对数据进行检索时,会产生更多的IO)

3、实例容量
        
MySQL是基于线程的服务模型,因此在一些并发较高的场景下,单实例并不能充分利用服务器的CPU资源,吞吐量反而会卡在mysql层,特别是对于mysql5.5版本。在mysql
5.6版本中 做了很大优化,而且percona 版本有thread pool ,可以充分应对高并发场景下CPU上下文切换消耗过高的问题。
        单实例QPS吞吐量一般控制在20000/s以内,写入量还需考虑从库延迟问题,对于mysql5.6版本可以考虑进行分库后再分表,充分利用5.6版本基于库级别的多线程复制,从而提高写入的吞吐量。

4、磁盘空间
        
服务器一般会承载多个数据库实例,因此在各个实例上线前,需要对各个实例进行
数据量的评估,以及1-2年内
主要的几个大表的增长量情况,对数据量的评估,尽量精确到每个字段。对于增长量不是特别快的业务(半年就翻倍的情况),建议1-2年的数据量,最终占磁盘使用率的70%以内。同时,对于一些数据增长较快,可以考虑使用大的慢盘进行数据归档。

MySQL准入规范及容量评估的更多相关文章

  1. mysql 性能容量评估

    性能容量评估   分析上线业务场景 评估数据库服务器所需性能指标 预估可能成为瓶颈的服务器资源 帮助数据库性能调优   数据库服务器硬件性能指标项: 磁盘IO性能 内存容量 CPU 网络吞吐量 磁盘容 ...

  2. 阿里:MySQL数据库规范

    阿里:MySQL数据库规范 简介:基于阿里数据库设计规范扩展而来 设计规范 1.[推荐]字段允许适当冗余,以提高查询性能,但必须考虑数据一致.冗余字段应遵循: 不是频繁修改的字段. 不是 varcha ...

  3. [转载] 根据多年经验整理的《互联网MySQL开发规范》

    原文: http://weibo.com/p/2304181380b3f180102vsg5 根据多年经验整理的<互联网MySQL开发规范> 写在前面:无规矩不成方圆.对于刚加入互联网的朋 ...

  4. MySQL数据库规范

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

  5. [转发] 老叶观点:MySQL开发规范之我见

    原文: http://imysql.com/2015/07/23/something-important-about-mysql-design-reference.shtml 老叶观点:MySQL开发 ...

  6. MySQL 数据库规范--调优篇(终结篇)

    前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...

  7. MySQL查看数据库表容量大小

    本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用. 1.查看所有数据库容量大小 select table_schema as '数据库', sum(table ...

  8. 从MySQL开发规范处看创业

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/n88Lpo/article/details/78099185 作者:唐勇.深圳市环球易购.MySQL ...

  9. 建议收藏 - 专业的MySQL开发规范

    为了项目的稳定,代码的高效,管理的便捷,在开发团队内部会制定各种各样的规范 这里分享一份我们定义的MySQL开发规范,欢迎交流拍砖 数据库对象命名规范 数据库对象 命名规范的对象是指数据库SCHEMA ...

随机推荐

  1. 【QT】QT下载与安装

    很简单 1.下载地址 http://download.qt.io/archive/qt/ 学个单词,archive. 选择一个版本下载,5.9.3. 2.安装 选择组件 MinGW就行了,MinGW- ...

  2. AngularJS中$timeout和$interval的用法详解

    1. 先将$interval,$timeout,作为参数注入到controller中,例如rds.controller('controllerCtrl', ['app', '$scope','$htt ...

  3. Elasticsearch学习之配置小记

    基于 elasticsearch 1.4.4 版本.安装方式为RPM安装.所有涉及路径需根据实际情况来设置判断. 0x01 内存调整 调整ES内存分配有多种方式,建议调整 /etc/sysconfig ...

  4. 宝塔使用FTP的问题

    我们在使用宝塔FTP面板的时候,会用到FTP工具,但是开的账号在使用 FTP或WinSCP的时候会出现问题,连接不上. 具体解决方式: 参考文档: https://blog.csdn.net/hc11 ...

  5. Java 文件读写操作

    1[1]按字节读写,一次只读取一个字节,效率比较低 package bk1; import java.io.File; import java.io.FileInputStream; import j ...

  6. ELK之从6.3.1升级至6.6.2

    需要把原6.3.1版本升级为6.6.2版本 1,官网下载rpm包 2,升级elasticsearch和kibana rpm -U elasticsearch-6.6.2.rpm rpm -U kiba ...

  7. 熟悉ROS系统中的话题

    描述:这篇教程主要讲解ROS系统中的话题及rostopic和rqt_plot等命令工具: 1. Setup安装1.1 roscore 首先确保roscore已经启动运行,打开一个新的命令终端,输入如下 ...

  8. [No0000162]如何不靠运气致富|来自硅谷著名天使投资人的40条致富经

    1. Seek wealth, not money or status. Wealth is having assets that earn while you sleep. Money is how ...

  9. python面向对象高级:枚举

    在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数.这两种类型经常(但不总是)重叠. 枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例 ...

  10. gfs故障恢复

    GlusterFS更换故障Brick tanzhenchao关注0人评论3918人阅读2017-03-21 09:53:18   1 前言 笔者公司内有一套GlusterFS分布式存储,最近数据分区的 ...