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树索引

  1. 全值匹配 order_sn='123456'
  2. 最左前缀 
  3. 匹配列前缀 order_sn like '123%'
  4. order_sn > '121'  and order_sn < '125'
  5. 精确匹配左前列,并范围匹配另外一列。 
  6. 只访问索引查询。(覆盖索引)

B树索引的限制(建了索引,但是没有生效)

  1. 命中的行太多
  2. 联合索引不是按照最左列查找。
  3. not in 和 <> 不能用索引
  4. 查询中某个列用范围查询,右边所有列都不能走索引。

Hash索引

特点
  1. 基于hash实现的
  2. 只有查询的条件精确匹配时,才能用到
  3. 所有列,存储引擎都会计算一个hash码,索引中存储的就是hash码。
限制
  1. 必须进行二次查找
  2. 无法用于排序
  3. 不支持部分索引查找
  4. 不支持范围查找
  5. hash码可能存在hash冲突

 

索引好处

减少扫描的数据量

帮助我们进行排序,避免用临时表

把随机IO变为顺序IO

 

索引越多越好?

太多了,性能有损耗。

  • 增加写入成本。数据变动要修改索引。innodb引入缓存,批量地操作。
  • 太多索引,影响查询优化器选择时间。
 
 
 
 
 
 
 
 

死锁

  • 设置锁等待超时时间 innodb_lock_wait_timeout 默认50s
  • 死锁检测 innodb_deadlock_detect 默认是on(耗CPU)

如何预防

  • 减少长事务
  • 加锁顺序一致
  • 可以不用RR,间隙锁会提高锁发生的概率

死锁的排查

  • 业务代码,error
  • show engine innodb status查看最近一次的死锁日志

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

posted @ 2023-07-20 23:48  CodingOneTheWay  阅读(6)  评论(0编辑  收藏  举报
回到顶部