性能监控
Schema与数据类型优化
数据类型的优化
更好的通常更好
简单就好
整型字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂
使用 mysql 自建类型而不是字符串来存储日期和时间
用整型存储 IP 地址
尽量避免 null
如果查询重包含可为 NULL 的列,对 mysql 来说很难优化,因为可为 null 的列使得索引,索引统计和值比较都更加复杂,坦白来说,通常情况下 null 的列改为 not null 带来的性能提升比较小,所以没有比较要将所有的表的 schema 进行修改,但是应该尽量避免设计成可为 null 的列
实际细则
整数类型:可以使用的几种数据类型 :TINYINT,SMALINT,MEDIUMINT,INT,BIGINT 分别使用 8,16,32,64 位存储空间,尽量使用满足需求的最小数据类型
合理使用范式和反范式
范式
优点:
当范式化的更新通常比反范式要快
当数据据好的范式化后,很少或者没有重复的数据
范式化的数据比较小,可以放在内存中,操作比较快
缺点:
通常需要进行关联
反范式
优点:
所有的数据都在同一张表中,可以避免关联
可以设计有效的索引
缺点:
表格内的冗余较多,删除数据会造成有些表有用的信息丢失
字符与字符串类型
varchar 根据实际内容长度保存数据
使用最小的符合需求的长度。
varchar(n) n小于等于 255 使用额外一个字节保存长度, n > 255 使用额外两个字节保存长度
varchar(5) 与 varchar(255) 保存同样的内容,磁盘存储空间相同,但内存占用不同,是指定大小
varchar 在 mysql5.6 之前变更长度,或者从 255 以下变更到 255 以上时,都会导致锁表
应用场景
存储长度波动较大的数据,如:文章,有的会很短,有的会很长
字符串很少更新的场景,每次更新后都会重新算并使用额外存储空间保存长度
适合保存多字节字符,如:汉字,特殊字符等。
char 固定长度的字符串
最大长度:255
会自动删除末尾的空格
检索效率,写效率会比 varchar 高,以空间换时间
应用场景
存储长度波动不大的数据,如:MD5 摘要
存储短字符串、经常更新的字符串
BLOD 和 TEXT 类型
MySQL 把每个 BLOB 和 TEXT 值当作一个个独立的对象处理。
两者都是为了存储很大数据而设计的字符串类型,分别采用二进制和字符方式存储
索引优化
B 树
B 树特点:
所有键值分布在整颗树中
搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找
每个节点最多拥有 m 个子树
根节点至少有 2 个子树
分支节点至少拥有 m/2 棵子树(处根节点和叶子节点外都是分支节点)
所有叶子节点都在同一层,每个节点最多可以有 m - 1 个 key 并且以升序排列
B+ 树
注意:在 B+Tree 上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间也是一种链式环结构。因此可以对 B + Tree 进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找.
数据库引擎——InnoDB
注意:
InnoDB 是通过 B+Tree 结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个 6 位的 row_id 来作为主键
如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表
网友评论