MySQL批量更新(下) – 性能检测
前言
前面写了批量更新的上篇–四种实现方式,本节对他们的性能进行测试。
本次测试
- 数据库隔离级别 READ-COMMITTED
- 表总计40万行
- 每次更新3000行
测试结果
方法一:CASE 指令 – 性能
- 【消息】:执行成功,当前返回 [3000] 行,耗时 [386ms.]
方法二:Join Update – 性能
- 【消息】:执行成功,当前返回 [3000] 行,耗时 [247ms.]
可以看出 join
的方式性能优于 case
原理
通过explain 我们可以看出两种批量更新性能差距的背后原理:
方法一
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
方法一 | 1 | UPDATE | base_slot | range | PRIMARY | PRIMARY | 8 | const | 3000 | 100.00 | Using where | |
方法二 | 1 | UPDATE | a | eq_ref | PRIMARY | PRIMARY | 8 | b.id | 1 | 100 |
其中 type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
,一般来说,得保证查询至少达到range级别,最好能达到ref。