一、无监控不性能
- show profile(s) [set profiling=1]
- performance_schema
- (show) processlist
二、数据更小的数据
- varchar
- 满足需求的最小数据类型(存储数据大小和占用空间大小是不一样的)
- 空间占用更小
- char
- 最大长度 255
- 查询自动清除尾部的空字符
- 读写查询性能更好
- datetime
- 占用8字节
- 时区无关(不依赖数据库设置的时区)
- 毫秒级数据存储,保存范围大
- timestamp
- 占用4字节
- 秒级数据存储,范围:1970-01-01~2038-01-19
- 采用整型存储
- 依赖数据库设置的时区
- 可自动更新timestamp的值,如创建或更新字段时候触发
- date
-
- 3字节
- 日期函数操作
- 范围:1000-01-01~9999-12-31
- 用int替换string,用date替换string
- 用enum枚举替换string(实际存储的是数值,对于客户端是一样的,优点是:存储的空间占用小,枚举猜测是维护到表信息中)
-
CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `type` enum('game','app') DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 用整型代替ip的字符串表示(通过函数),【注:如果需要检索就不太合适】
-
select inet_aton('192.168.1.1'); select inet_ntoa('3232235777');
-
- 避免null(优化空间较小)
三、范式与反范式
- 3范式的作用:减少冗余
- 第一范式:表中的列只能含有原子性(不可再分)的值 如地址:包含了省 市 区
- 第二范式:满足第一范式,没有部分依赖 1对多关系,如果将订单的信息存在订单项中,则会存在一些重复的信息
- 第三范式:满足第二范式,没有传递依赖 每个列要直接依赖主键,而不是间接
- 反范式:增加冗余,空间换查询性能
四、主键
- 自然主键 如身份证号,订单号等
- 代理主键 如自增ID ->更容易维护,但这个看具体业务要求
五、字符集的选择
- utf-8(2字节),可以单独对表字段设置utf8mb4(但尝试只对字段设置无法保存emjoy表情,修改了表的字符集之后才能正常存储:参考版本mysql5.7)
- utf8mb4(emjoy表情)
六、存储引擎(数据文件的组织形式)
- innoDB
- MyIsAM
参考比较
MyisAM | InnoDB | |
支持事务 | 否 | 是 |
支持表锁 | 是 | 否 |
支持行锁 | 否 | 是 |
支持外键 | 否 | 是 |
支持全文索引 | 是 | 5.6+ |
适合操作类型 | 大量select | 大量del、update、insert |
七、适当的数据冗余
- 需要统计才能计算出的数据(数据延迟,旧数据问题)
- 需要多表join的数据(数据维护问题)
八、适当拆分
- 水平拆分:日期、区域等字段或规则进行拆分
- 垂直拆分:单表拆成多表,一般适用于附加属性的同时查询次数比较少,主属性查询次数频繁的情况