探索InnoDB并行读

导读
作者:蒋乐兴    MySQL-DBA 目前在 github 上维护着两套 MySQL 开源工具 mysqltools & dbm(dbm-agent dbm-center),对机器学习和程序化交易也有些心得。

一想到你在关注我就忍不住有点紧张


一、innodbparallelread_threads

这个参数控制着聚集索引扫描时 innodb 层面的并发数,核心数无限的情况下并发数越大,返回结果的时间就越短

二、环境准备

我们准备用innodb 之前最不擅长的一个场景来测试这参数的功能,那这是一个什么场景呢?答案就是 select count(*) from t; 下面为表t准备80w行数据

1、 建表


   
   
  1. mtls-perf-bench --host=127.0.0.1 --user=root --password=dbma@0352 --port=3306 --ints=8 --floats=8 --varchars=4 --database=tempdb create

2、 检查表结构


   
   
  1. mysql> select @@version;

  2. +-----------+

  3. | @@version |

  4. +-----------+

  5. | 8.0.18 |

  6. +-----------+

  7. 1 row in set (0.00 sec)

  8. show create table tempdb.t;

  9. CREATE TABLE `t` (

  10. `id` int(11) NOT NULL AUTO_INCREMENT,

  11. `i0` int(11) NOT NULL,

  12. `i1` int(11) NOT NULL,

  13. `i2` int(11) NOT NULL,

  14. `i3` int(11) NOT NULL,

  15. `i4` int(11) NOT NULL,

  16. `i5` int(11) NOT NULL,

  17. `i6` int(11) NOT NULL,

  18. `i7` int(11) NOT NULL,

  19. `c0` varchar(128) NOT NULL,

  20. `c1` varchar(128) NOT NULL,

  21. `c2` varchar(128) NOT NULL,

  22. `c3` varchar(128) NOT NULL,

  23. `f0` float NOT NULL,

  24. `f1` float NOT NULL,

  25. `f2` float NOT NULL,

  26. `f3` float NOT NULL,

  27. `f4` float NOT NULL,

  28. `f5` float NOT NULL,

  29. `f6` float NOT NULL,

  30. `f7` float NOT NULL,

  31. PRIMARY KEY (`id`)

  32. ) ENGINE=InnoDB

3、 完全随机的插入 80w 行数据


   
   
  1. mtls-perf-bench --host=127.0.0.1 --user=root --password=dbma@0352 --port=3306 --ints=8 --floats=8 --varchars=4 --database=tempdb --parallel=16 --rows=800000 insert
虚拟机 cpu:4核、mem:4G、innodb bufferpool_size:1G、t.ibd:324M


三、性能测试

1、 对数据进行预热

   
   
  1. -- 执行 select count(*) from tempdb.t

  2. -- 8 次

2、 一个并发下的响应时间(1.04s)


   
   
  1. mysql> show global variables like 'innodb_parallel_read_threads';

  2. +------------------------------+-------+

  3. | Variable_name | Value |

  4. +------------------------------+-------+

  5. | innodb_parallel_read_threads | 1 |

  6. +------------------------------+-------+

  7. 1 row in set (0.01 sec)

  8. mysql> select count(*) from tempdb.t;

  9. +----------+

  10. | count(*) |

  11. +----------+

  12. | 800000 |

  13. +----------+

  14. 1 row in set (1.04 sec)

3、 二个并发下的响应时间(0.59s)


   
   
  1. mysql> show global variables like 'innodb_parallel_read_threads';

  2. +------------------------------+-------+

  3. | Variable_name | Value |

  4. +------------------------------+-------+

  5. | innodb_parallel_read_threads | 2 |

  6. +------------------------------+-------+

  7. 1 row in set (0.01 sec)

  8. mysql> select count(*) from tempdb.t;

  9. +----------+

  10. | count(*) |

  11. +----------+

  12. | 800000 |

  13. +----------+

  14. 1 row in set (0.59 sec)

4、 四个并发下的响应时间(0.55)


   
   
  1. mysql> show global variables like 'innodb_parallel_read_threads';

  2. +------------------------------+-------+

  3. | Variable_name | Value |

  4. +------------------------------+-------+

  5. | innodb_parallel_read_threads | 4 |

  6. +------------------------------+-------+

  7. 1 row in set (0.01 sec)

  8. mysql> select count(*) from tempdb.t;

  9. +----------+

  10. | count(*) |

  11. +----------+

  12. | 800000 |

  13. +----------+

  14. 1 row in set (0.55 sec)

5、 八个并发下的响应时间(0.29)


   
   
  1. mysql> show global variables like 'innodb_parallel_read_threads';

  2. +------------------------------+-------+

  3. | Variable_name | Value |

  4. +------------------------------+-------+

  5. | innodb_parallel_read_threads | 8 |

  6. +------------------------------+-------+

  7. 1 row in set (0.01 sec)

  8. mysql> select count(*) from tempdb.t;

  9. +----------+

  10. | count(*) |

  11. +----------+

  12. | 800000 |

  13. +----------+

  14. 1 row in set (0.29 sec)

四、结论

提高 innodb 并行读线程数(innodb_parallel_read_threads) 在特定场景下可以明显的提升性能。

原文链接:https://www.sqlpy.com/blogs/books/1/chapters/7/articles/114

扫码加入MySQL技术Q群

(群号:650149401)

   

点“在看”给我一朵小黄花

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值