高性能数据库之二 MySQL基准测试与MySQL设计

一、MySQL基准测试工具
测试目的:
建立MySQL服务器的性能基准线
模拟比当前系统更高的负责,以找出系统扩展瓶颈并发等
测试不同硬件软件和操作系统配置
证明新的硬件设备是否配置正确

测试方法:
I、对整个系统进行基准测试
优点:
能够测试整个系统的性能,包括web服务器缓存数据库等
能反映出系统中各个组件接口间的性能问题体现真实性能状况

缺点:测试复杂、耗时长

II、单独对MySQL进行基准测试
优点:测试设计简单、耗时短
缺点:无法对整个系统性能进行评估

测试指标:
单位时间内所处理的事务数(TPS)
单位时间内所处理的查询数(QPS)
响应时间
并发量:同时处理的查询请求的数量(正在工作中并发的操作数和同时工作的数量)

测试中容易忽略的问题:
使用生产环境数据时只使用了部分数据
在多用户场景中,只做单用户测试。推荐多用户测试
在单服务器上测试分布式应用(推荐相同架构进行测试)
测试只不过反复执行同一查询(会存在缓存中,无法查询真实内容)

基准测试工具
mysqlslap测试工具
常用参数说明
–auto-generate-sql 由系统自动生成sql脚本进行测试
–auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
–auto-generate-sql-load-type 指定测试中使用的查询类型
–auto-generate-sql-write-number 指定初始化数据时生成的数据量
–concurrency 指定并发线程数量
–engine 指定测试表的存储引擎,可用逗号分割多个存储引擎
–no-drop 指定不清理测试数据
–iterations 指定测试运行的次数,与no-drop参数互相冲突
–number-of-queries 指定每一个线程查询的数量
–debug-info 指定输出额外的内存以及CPU统计信息
–number-int-cols指定测试表中包含的INT类型类的数量
–number-char-cols 指定测试表中包含的varchar类型的数量
–create-schema指定了用于执行测试的数据库的名字
–query 用于指定自定义SQL的脚本
–only-print 打印生成的测试脚本(不运行)

sysbench测试工具

二、数据库结构优化
目的:
减少数据冗余
尽量避免数据维护中出现更新、插入和删除异常
节约数据库存储空间
提高查询效率

数据库设计步骤
需求分析:全面了解产品设计的存储需求(存储需求、数据处理需求、数据的安全性和完整性)
逻辑设计:设计数据的逻辑存储结构(数据实体之间的逻辑关系、解决数据冗余和数据维护异常)
物理设计:根据所用的数据库特点进行表结构设计
维护优化:根据实际情况对索引、存储结构进行优化

数据库设计范式
第一范式:
数据库表中所有字段都具有单一属性
单一属性的列是由基本的数据类型所构成的
设计出来的表都是简单的二维表

第二范式:
要有一个表中只具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列对只对部门主键的依赖关系

第三范式:
每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主属性对主键的传递依赖

反范式化:
为了性能和读取效率而适当的对数据库设计范式的要求进行违反,允许存在少量数据冗余,即用空间来换取时间

物理设计
I、定义数据库、表及字段的命名规范
数据库、表及字段的命名遵守可读性原则
遵守表意性原则
遵守长名原则
II、选择合适的存储引擎
高性能数据库之二 MySQL基准测试与MySQL设计
III、为表中的字段选择合适的数据类型
列类型 存储空间 取值范围(signed/unsigned)
tinyint 1字节 -128–127 0–255
smallint 2字节 -32768–32767 0–65535
mediumint 3字节 -8388608–8388607 0–16777215
int 4字节 -2147483648–2147483647 0-4294967295
bigint 8字节

实数类型
FLOAT 4字节 非精确类型 float(M,D)M代表总位数,D代表小数点后的位数,下同
DOUBLE 8字节 非精确类型
DECIMAL 每四字节存9个数字,小数点占一个字节 是精确类型
varchar 存储变长字符串,只占用必要的存储空间
char 存储固定长度
datetime:与时区无关,占用八个字节
timestamp:与时区有关,存储时间戳 从1970到当今的时间戳 占用四个字节,自动更新( 多个timestamp同时使用时,默认只有第一个自动更新)
date:3个字节,可以利用日期函数计算
time:存储时间部分HH:MM:SS
注意事项:
不要使用字符串类型来存储日期时间数据
使用int存储时间不如使用timestamp
IIII、建立数据库结构

如何选择innodb主键:
主键应该尽可能的小
主键应该顺序增长,增加数据插入效率
innodb主键和业务主键可以不同