《叶问》30期,优雅的InnoDB大表COUNT方案

首发:微信公众号「知数堂」
出处:https://mp.weixin.qq.com/s/-FDJ_-z6oJbRgRaCKXoyjg

关 于 叶 问

《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。

2020年6月12日,周五

《叶问》第30期,有什么方案可以优雅地实现MySQL大表count操作?

  1. 首先MySQL innodb引擎并不是特别适合做count操作(MyISAM虽然count代价很小,但是不推荐再使用了)

  2. 对于count操作,MySQL会优先选择非空的二级索引,原因是一般来说二级索引所占的空间更小,读取的成本会更低

  3. MySQL8.0对于没有WHERE条件的count支持并行读,效率更高

  4. 可考虑Redis或ES等nosql或newsql实现计数的方案,例如:业务写入MySQL同时对Redis对应的key做incr或decr等操作

延伸阅读
为何COUNT很慢却不写SLOW LOG

《叶问》第29期,8.0.20已经发布,8.0的周边呢?本期大家一起来讨论下MySQL 8.0周边生态(如备份、监控、高可用、DDL工具等)

首发:微信公众号「知数堂」 出处:https://mp.weixin.qq.com/s/Og5000ETjxJftUYQOA7iaQ

MySQL 8.0最新版本已经更新到8.0.20版本,那么周边生态如何呢?

8.0新特性可以参考《叶问》23期

  1. 备份工具可以使用xtrabackup 8.0.11版本(由于8.0.20 redo log格式变化,目前还不支持),目前也支持Clone Plugin,快速完成从机部署

  2. 高可用方案在MySQL5.7的基础上,可以参考InnoDB Cluster解决方案

  3. DDL工具仍然可以使用pt-osc、gh-ost等,需要注意的是支持INSTANT的操作可以立刻完成(如新增列),不再需要第三方DDL工具

  4. 监控仍然可以使用promethues、PMM、zabbix等解决方案,但是相较于之前的版本,MySQL 8.0指标项更多(INNODB_METRICS指标多达308个,MySQL5.7为235个)

  5. 中间件部分,可以使用官方Router或者ProxySQL,来自爱可生的DBLE3.0目前也已经支持8.0

  6. 开发语言支持,建议直接升级驱动,可参考《PHP连接MySQL 8.0报错解决办法》

《叶问》第28期,表里某个字段,同时创建了索引和直方图,执行计划会怎么选择?

首发:微信公众号「知数堂」
出处:https://mp.weixin.qq.com/s/mSuu8VyXR75fLeSn6Ce8Dw

亲测在有索引的情况下,优化器会选择索引统计信息而非直方图,例如:

"considered_execution_plans": [
 {
   "table": "`t1`",
   "chosen": true,
   "plan_prefix": [],
   "cost_for_plan": 0.35,
   "rows_for_plan": 1,
   "best_access_path": {
     "considered_access_paths": [
       {
         "cost": 0.35, cost这个就非常低,所以毫无悬念的选择索引
         "rows": 1,
         "index": "k1",
         "chosen": true,
         "access_type": "ref"
       },
       {
         "cause": "heuristic_index_cheaper",
         "chosen": false,
         "access_type": "range",
         "range_details": {
           "used_index": "k1"
         }
       }
     ]
   },
   "condition_filtering_pct": 100
}

对于直方图有几点说明:

-通常可以依靠索引的执行计划是最好的,直方图统计信息对于非索引列特别有用
-直方图并不像MySQL的索引一样会自动维护,必须通过手动去维护,线上建议业务低峰期进行维护
-通常来说直方图的适用场景是:
-随时间变化不大的值
-低基数值
-分布不均
-直方图无法使用的场景是:
-加密表、临时表
-JSON数据类型、空间数据类型
-已创建唯一索引的单列

更多内容请移步叶老师最新推文:《一文读懂MySQL 8.0直方图》

《叶问》第27期,除了ping以外,还有什么靠谱的方法观测和监控网络延迟?

首发:微信公众号「知数堂」
出处:https://mp.weixin.qq.com/s/JEYxzm7VX9gRZhiqeurMyQ

关 于 叶 问

《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。

2020年04月20日,周一

除了ping以外,还有什么靠谱的方法观测和监控网络延迟?

1、网络监控首推smokeping,基于fping指令构建的网络延迟监控、可视化平台 https://github.com/oetiker/SmokePing

2、其次smartping类似smokeping:https://github.com/smartping/smartping

3、另外社区同学推荐的有elastic heartbeat 配合ELK以及check_mk的mrpe 调用nagios-plugins-icmp nagios-plugins-tcp

4、命令行工具mtr,同样可以结合zabbix进行网络延迟监控

《叶问》第26期,主从测试过程中,如何模拟网络抖动?

首发:微信公众号「知数堂」
出处:https://mp.weixin.qq.com/s/3Ksr7FmiyLcdOnBeuBPYqQ

关 于 叶 问

《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。

2020年03月13日,周五

主从测试过程中,如何模拟网络抖动?

推荐工具:tc,常用的使用方式如下:

1、模拟延迟 tc qdisc add dev eth0 root netem delay 1000ms 100ms 50%

这里表示有50%的包延迟会在1000+-100ms之间波动

2、模拟丢包 tc qdisc add dev eth0 root netem loss 1% 30%

这里表示eth0网卡丢失1%的包,成功率为30%

3、模拟包重复 tc qdisc add dev eth0 root netem duplicate 1%

设置eth0网卡随机产生1%的重复包

4、模拟包损坏 tc qdisc add dev eth0 root netem corrupt 1%

设置eth0网卡随机产生1%的损坏数据包

5、模拟包乱序 tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

设置eth0网卡有25%的数据包(50%的关联度)会被立即发送,其他的延迟10ms发送。