mysql相关
字段类型的选择
优先级:数字类型 》 日期、二进制》 字符型
相同级别的数据类型,应该选用占用空间小的类型。
原因:
数据比较,字符类型和当前排序规则相关,数字和二进制不需要。
数据处理是以页为单位,innodb中是16K,数据小,容纳的就多,加载的页就少,减少磁盘IO。
实际分析
整数类型
例如
有的人用int(2) 。实际这种2没有意义。 对存储空间没什么影响。要选择的类型正确才行。
Varchar和Char类型
Varchar存储特点
- Varchar用于存储变长字符串,只占用必要的存储空间。(一个字符有多个字节。)
- varchar小于255长度,占用一个长度字节。大于255,占用两个字节存储长度。
- 65535是innodb最长的,所有varchar列共享的长度。
-
varchar适用于很少被更新的字段,容易产生碎片。
varchar长度的选择
- 使用最小的符合需求的长度
- 结合业务
- 名字长度怎么也不能定义到255长度
- 列的宽度尽量有提前量,mysql5.7版本之后修改宽度,还是在255内,不锁表。大于255,还是锁表的。
- mysql为了优化查询,越短越省内存。
char类型
最大255
适合存储
- 长度接近:MD5值、身份照、手机号
- 短字符串(男、女)eg: uft-8中存男女 cha用3字节 varchar 要四个字节 因为有一个字节存长度。
日期类型
- DataTime类型
- mysql5.6 前存s ,之后能存微秒,datatime(6)就能存微秒。
- 与时区无关
- 时间范围1000年到9999年
- 最常用
- timestamp类型 时间戳
- 存了1970到现在的秒数
- 能存1970到2038年。
- 依赖时区。
Mysql复制功能
可以复制,增加读机器,性能比较快,分批复制。
MYSQL日志
索引
告诉存储引擎,怎么快速找到数据。
数据少差不太多,数据多,内存存不下了,就能看出来。
索引过少和过多都不好。
常见索引类型(存储引擎层特有的)
B树索引(也叫B+树):
叶子结点有下一个叶子的指针,方便遍历。平衡查找树,顺序存放,在同一层。
mysam(根据数据物理位置引用行)innodb(根据主键引用行的)
更适合范围查找
什么情况下可以用到B树索引
- 全值匹配 order_sn='123456'
- 最左前缀
- 匹配列前缀 order_sn like '123%'
- order_sn > '121' and order_sn < '125'
- 精确匹配左前列,并范围匹配另外一列。
- 只访问索引查询。(覆盖索引)
B树索引的限制(建了索引,但是没有生效)
- 命中的行太多
- 联合索引不是按照最左列查找。
- not in 和 <> 不能用索引
- 查询中某个列用范围查询,右边所有列都不能走索引。
Hash索引
特点
- 基于hash实现的
- 只有查询的条件精确匹配时,才能用到
- 所有列,存储引擎都会计算一个hash码,索引中存储的就是hash码。
限制
- 必须进行二次查找
- 无法用于排序
- 不支持部分索引查找
- 不支持范围查找
- hash码可能存在hash冲突
索引好处
减少扫描的数据量
帮助我们进行排序,避免用临时表
把随机IO变为顺序IO
索引越多越好?
太多了,性能有损耗。
- 增加写入成本。数据变动要修改索引。innodb引入缓存,批量地操作。
- 太多索引,影响查询优化器选择时间。
死锁
- 设置锁等待超时时间 innodb_lock_wait_timeout 默认50s
- 死锁检测 innodb_deadlock_detect 默认是on(耗CPU)
如何预防
- 减少长事务
- 加锁顺序一致
- 可以不用RR,间隙锁会提高锁发生的概率
死锁的排查
- 业务代码,error
- show engine innodb status查看最近一次的死锁日志