一、数据库设计

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数据去重语句_数据库 mysql 语句

    LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言 mysql:常用代码 create table CeShi1 ( Uid varchar(50) primary key, P ...

  2. mysql数据归档原则_数据库中的归档是什么意思?

    若干套 MySQL 环境,只有一套: ∘ 行为异常,怀疑触发 bug ∘ 性能异常,比其他环境都要低 在这种场景下,我们一般的做法是首先控制变量,查看软硬件配置,以及 MySQL 的参数配置.关于 M ...

  3. mysql数据无故回档_数据库回档解决方案 - osc_hajrc28s的个人空间 - OSCHINA - 中文开源技术交流社区...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者介绍:李明,腾讯云数据库架构师华南区负责人,曾在某专业数据库服务商.51job任职DBA. 作为一名DBA,日常工作中免不了需要做一些救 ...

  4. 查看mysql数据库容量大小

    查看mysql数据库容量大小 第一种情况:查询所有数据库的总大小,方法如下: mysql> use information_schema; mysql> select concat(rou ...

  5. DM 数据迁移工具——DTS(MySQL数据迁移到DM8数据库 Windows环境)

    DM 数据迁移工具--DTS MySQL数据迁移到DM8数据库 Windows环境 DM 数据迁移工具 DM DTS 提供了主流大型数据库迁移到 DM.DM 到 DM.文件迁移到 DM 以及 DM 迁 ...

  6. 互联网性能与容量评估的方法论和典型案例

    https://www.jianshu.com/p/fbf56ccb4ebe 1 背景 本文欢迎转载,转载请注明原文链接,并附作者个人信息李艳鹏. 性能至上 武林中,"天下武功出少林&quo ...

  7. 查看mysql整个库的数据大小_查看mysql数据库容量大小

    第一种情况:查询所有数据库的总大小,方法如下: mysql> use information_schema; mysql> select concat(round(sum(DATA_LEN ...

  8. mysql表增加一行_数据库表增加一行数据

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. mysql数据转存到时序数据库_干货丨如何高速迁移MySQL数据到时序数据库DolphinDB...

    DolphinDB提供了两种导入MySQL数据的方法:ODBC插件和MySQL插件.我们推荐使用MySQL插件导入MySQL数据,因为它的速度比ODBC导入更快,导入6.5G数据,MySQL插件的速度 ...

最新文章

  1. 查看python版本号-Mac终端查看python版本号
  2. MyBatis从缓存查找数据的依据
  3. 判断一个字符串大写小写,和数字出现的次数
  4. Tips--TensorFlow报错:tensorflow:Early stopping conditioned on metric `val_loss` which is not available
  5. Python 告诉你,情人节该送什么礼物?
  6. selinux详解及配置文件
  7. B2C电商产品系统分析
  8. css美化滚动条样式,css3美化滚动条样式
  9. 洛谷-P1957 口算练习题
  10. 解决 手机能连接上wifi而电脑却却不能连接上wifi的情况
  11. java监听服务器信息,java实时监控服务器状态
  12. 数据库概念设计与逻辑设计
  13. 37岁被裁员,出来再找工作,大公司不愿要,无奈去小公司面试,HR的话扎心了
  14. windows系统完全换ubuntu
  15. 基于视觉的机器人抓取: 论文及代码(Vision-based Robotic Grasping: Papers and Codes)
  16. 【渝粤题库】陕西师范大学165205 组织设计与人力资源规划 作业(专升本)
  17. 中国InGaAs APD模块市场深度研究分析报告
  18. 体育IP价值大爆发 本土赛事IP蕴含着巨大发展潜力
  19. 论文三线表中表头添加横线间隔线
  20. 在U盘安装Windows系统,Mac电脑期待已久的工具WTG

热门文章

  1. 在Ubuntu上安装Mono
  2. 如何限制服务器sql内存占用,如何在 SQL Server 中使用配置选项调整内存使用量
  3. 【Keras-ResNet】CIFAR-10
  4. MATLAB :【11】一文带你读懂serialport串口收发原理与实现
  5. 电脑计算机硬盘坏了如何修理,电脑硬盘坏了能修吗?电脑硬盘坏了的解决办法...
  6. 桌面云实质性的解决方案
  7. 基于SSM+springboot框架系统的易购网
  8. Android入门之Activity四种启动模式
  9. oracle job执行chain,全面学习ORACLE Scheduler特性(9)使用Chains之创建CHAIN
  10. 智慧配煤解决方案,焦化行业产能提升解决方案