mysql 杂识

1. mysql慢查询记录中除了记录超过long_query_time 时间的sql,还记录没有使用索引的查询,可以使用参数log_queries_not_using_index 设置开闭

2. timestamp 占4个字节,可表示时间范围少,自带时区

3. int(1) 和 int(11) 区别: 都是int ,占64个字节,1和11 表示的是显示长度,设置zerofill 可以看到左侧补0 ,即11 表示的是当位数不足时在

左侧加0补足位数. 

4. varchar 可变长度,需要额外一到两个(0-255或大于255)字节存储字符串长度,比char 多占用空间。

5. to_days() 返回从0到该日期的天数 

6. 前缀索引 alter table tb add key(city(7))

7. 覆盖索引: 包含所有查询需要的索引称为覆盖索引。含查询条件和查询结果列。 如: 

  select uid from tb where cc='x' 有一个组合索引(cc,uid), 则此查询可以利用该索引直接返回,

  而不必再获取索引后去查询主键索引对应的数据,使用explain 结果中extra列为using index 表示

  使用了覆盖索引

8. mysql 间隙锁: 间隙锁会锁定辅助索引(又称二级索引,即非主键聚集索引以外的索引)两个叶子节点之间多余区域,如有数据a1 ,a3,a5,对应数据列

有二级索引。此时对a3 做删除操作等,会对a1和a3 ,a3 和a5 之间区域加锁,此时如果想插入a2 或a4 则需要上一步删除操作完成提交。 所以间隙锁会

影响插入性能。

9. mysql explain 结果中的type=index 说明使用了索引来做排序 

10. pt-duplicate-key-checker工具 可以检查mysql 重复索引

11. mysql limit 偏移量很大时,如select * from tb limit 10000,10 , 由于要查询* 所有列,此时mysql 会在索引后获取id,再去关联主键索引获取其他数据列,

很慢。可以使用延迟关联提高效率。select * from tb inner join (select id from tb where limit 10000,10) t using id .

12. mysql 即使有索引,也不一定使用,可参考统计值cardinality  .(通过 show index from tb 获取)

13. mysql 可以用on duplicate key update 解决有更新无插入的并发问题,判断依据是语句中的索引。如:

insert into tb(id,name) values(3,'aa') on duplicate key update name='aa'

14. mysql update 能确定走索引的时候加行锁,否则表锁,所以对于一个长事务中的update 语句要注意可能锁表,导致其他操作超时。

原文地址:https://www.cnblogs.com/zhangchenglzhao/p/12620359.html