明明有个索引“感觉”应该被选中,EXPLAIN时在possible_keys也有它,但最后没被选中,可能的原因有哪些?

傅干
• 阅读 285

目录

  • MySQL 8.0相对于5.7的复制改进,都有哪些呢?
  • 跑truncate table,4亿条数据会不会造成长时间锁表呢?有什么更好的方法吗?
  • 明明有个索引“感觉”应该被选中,EXPLAIN时在possible_keys也有它,但最后没被选中,可能的原因有哪些?
  • 主从复制线程均正常(为Yes,也没报错),Master的binlog已到binlog.000100,但slave上看到Master_Log_File却只到binlog.000090,可能的原因有哪些?

一、MySQL 8.0相对于5.7的复制改进,都有哪些呢?

宋利兵老师:《MySQL 8.0相对于5.7的复制改进》的公开课也讨论了这个命题,简单概括主要有两部分:

(一)普通复制功能改进

1、新增WRITESET并行复制模式,提高并行度,降低延迟

2、在多源复制中,可在线动态修改每个channel的filter rule,并且能在P_S中查看/监控

3、Binary Log中存储更多元数据,并支持毫秒级别的延迟监控

4、对JSON Documents的复制效率更高了

5、支持DDL Crashsafe

6、增加caching_sha2_password安全策略,提高复制安全性

(二)MGR功能改进:

1.支持设置节点权重,且权重最大的在线节点将被选举为主

2.每个节点中存储更多的状态信息,如版本、角色等

3.可根据从节点的事务状态,自动化流控

4.离开集群的服务器自动被设置为read only,避免被误操作更新数据

5.可监控MGR的内存使用情况

二、跑truncate table,4亿条数据会不会造成长时间锁表呢?有什么更好的方法吗?

最好是create新表,然后交叉rename对调,再drop/truncate table或其他方式清除数据。

(一)可操作步骤:

1、创建新的 tmp 表,正式表与tmp表表名交换(注意在一个SQL里完成,并锁表)

2、对 tmp 表创建硬链接 ln tmp.ibd tmp.ibd.hdlk

3、mysql中删除表tmp(truncate / drop 都行)

4、然后找个业务不繁忙的时间删除数据文件或者用coreutils 的truncate慢慢搞

(二)关于truncate table,官档解释:

Logically, TRUNCATE TABLE is similar to a DELETE statement that deletes all rows, or a sequence of DROP TABLE and CREATE TABLE statements
When a table is truncated, it is dropped and re-created in a new .ibd file, and the freed space is returned to the operating system

三、明明有个索引“感觉”应该被选中,EXPLAIN时在possible_keys也有它,但最后没被选中,可能的原因有哪些?
(一)执行计划如下:

desc select * from t1 where c2 >= 2; 
key: NULL 
key_len: NULL 
rows: 14 
filtered: 92.86 
Extra: Using where

(二)可能的原因如下:

1、隐式转换

2、表碎片,因为表的碎片率过高

3、根据索引读取到的数据在整个表中的数据占比超过30%

4、统计信息没有及时更新

(三)上述执行计划的结果是:

预计扫描的行数为14行,filtered(是指返回结果的行占需要读到的行的百分比)的值为92%。

当前执行计划中filtered值92% 说明根据索引查询获取的结果占整张表的92%,在MySQL中根据索引查询的结果占整张表的数据30%则不会走索,所以不会走索引。
另外,也有可能是表的碎片率过高或隐式转换导致的。

四、主从复制线程均正常(为Yes,也没报错),Master的binlog已到binlog.000100,但slave上看到Master_Log_File却只到binlog.000090,可能的原因有哪些?

首先要注意,这是Master_Log_File IO线程延迟,并不是Relay_Master_Log_File SQL线程延迟。

(一)可能的原因如下:

1、由于sync_relay_log值过低,导致Slave频繁刷新relay_log文件,使 Slave的硬盘资源消耗过高,所以导致SlaveIO Thread很慢。

2、Master/Slave压力过大导致Slave IO Thread不能及时响应, 无法及时获得Master的event。

3、网络丢包严重。小包可以连接并且保持连接不断,但是大包就无法发送。可能是Master和Slave关于TCP MTU值设置不一致导致。

4、Master和Slave网络链接已经断开。但slave_net_timeout值等于0(表示完全禁用心跳)或者slave_net_timeoutSlave_heartbeat_period非常大(表示检测主从心跳的时间)。

5、Master的binlog非常大,io线程的file很长时间都在读同一个。

(二)总结

本次案例是在主库进行压力测试,在压力测试的过程中,因为Master本身的压力就很大Master来不及把binlog发送给Slave。所以表面上看起来没有延迟,但实际上已经产生了延迟。


公众号:知数堂,更多MySQL干货知识,关注公众号获取。

原文链接:https://zhishutang.com/dp8

推荐阅读:https://zhishutang.com/xdI

点赞
收藏
评论区
推荐文章
面试官突击一问:深入理解mysql技术
京东Java研发岗一面(基础面,约1小时)自我介绍,主要讲讲做了什么和擅长什么springmvc和springboot区别@Autowired的实现原理Bean的默认作用范围是什么?其他的作用范围?索引是什么概念有什么作用?MySQL里主要有哪些索引结构?哈希索引和B树索引比较?Java线程池的原理?线程池有哪些?线程池
不是海碗 不是海碗
2年前
通知短信有什么作用?它的应用场景有哪些?
互联网时代,短信给我们的生活带来惊喜和方便。现在网络无时无刻的充斥着人们的生活,短信已经成为维系商家和客户的无形的纽带起着至关重要的作用。那么通知短信有哪些作用呢?
用于双目重建中的 GPU 编程:julia-cuda
julia是2010年开始面世的语言,作为一个10后,Julia必然有前辈们没有的特点。Julia被期望塑造成原生的有C的运行速度、python的易交互性以及胶水性。最重要的是,julia也是nVidiacuda官方选中的接口语言,这点让cuda编程变得稍微容易一些。
Wesley13 Wesley13
3年前
JS相关重点知识 (概况)
1.value和innerHTML没有联系,只是value是表单的一个特有属性,而innerHTML是通用的。2.当从外部引入js文件时,该外部文件里面可以有多个方法,  html页面中的onclick只选中其中一个方法即可。   做法是在<scriptsrc"外部文件名.js"</script   注意:外部脚
Stella981 Stella981
3年前
Android ListView长按事件弹出菜单并获取选中的item
看了很多listview的长按事件,但几乎都是只给出弹出菜单的代码,没有给出选中的某个项的代码,我贴个全的吧,免得摸索麻烦思路就是listview在父窗口先注册一个长按弹出菜单registerReceiver》设置一个长按的listener,保存好选中item数据》onCreateContextMenu添加菜单》onContextItemSel
Wesley13 Wesley13
3年前
SQL语句优化
SQL语句优化规范:1\.使用mysqlexplain对sql执行效率进行检测,explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。1)使用方法:在select语句前加上explain即可2)explain分析结果形式如下:table|type
Wesley13 Wesley13
3年前
mysql查询优化explain命令详解
mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索引,扫描了多少行数,有没有触及全表扫描、用到临时表等影响慢查询的原因。使用很简单,如explainselect\fromuse
数据中台应具备哪些功能?
数据中台对于大部分人来说,都是使用数据中台,如果让你来搭建一个数据中台,你知道应该搭建什么功能,才算是一个相对合格的数据中台吗?数据中台在普通开发者来说,感觉就是有很多功能,那么具体有哪些呢?就算是一名普通开发者,也应该知道数据中台具备哪些功能,里面的具体
3A网络 3A网络
2年前
明明加了唯一索引,为什么还是产生了重复数据?
明明加了唯一索引,为什么还是产生了重复数据?前言前段时间我踩过一个坑:在mysql8的一张innodb引擎的表中,加了唯一索引,但最后发现数据竟然还是重复了。到底怎么回事呢?本文通过一次踩坑经历,聊聊唯一索引,一些有意思的知识点。1.还原问题现场前段时间,为了防止商品组产生重复的数据,我专门加了一张防重表。如果大家对防重表,比较感兴趣,可以看看
慢SQL原因分析之索引失效 | 京东物流技术团队
现象最近收到一个慢sql工单,慢sql大概是这样:“selectxxxfromtabelwheretype1”。咦,type字段明明有索引啊,为啥是慢sql呢?原因通过执行explain,发现实际上数据库执行了全表扫描,从而被系统判定为慢sql。这时有一定
达里尔 达里尔
1年前
layui复选框取消父级子级的关联
layui项目中需要个需求,layui树形结构组件tree,复选框选中的时候不能影响子级和父级,现在是复选框选中的时候父级多选会被选中,子级也会被选中有个参数,tree.js源码里有一个参数可以解决,但是现在layui的文档里没有渲染树形结构的时候加个参数