mysql foreach 写法,多条 sql 与一条 sql 的性能消耗分析

102 阅读1分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

前言

  1. @author JellyfishMIX - github / blog.jellyfishmix.com
  2. LICENSE GPL-2.0

从 mysql 客户端发送到 mysql server

  1. 比如有 100 条 sql,如果不手动开启事务把这 100 条 sql 放在同一个事务中执行,那么这 100 条 sql 会分别在 100 个隐式事务中。每个事务占用一个连接,这样就占用了 100 个连接。

  2. 虽然 mysql 客户端有连接池,但是占用大量的连接会导致连接池中连接数量不够用,连接池会创建新的连接,有性能开销。而且如果每次请求都执行 100 条 sql,qps 500 的话,100 * 500 = 50000 个事务,需要 5w 个连接,这样创建的开销是很大的。

  3. 虽然 mysql 客户端连接池可以设置最小连接数/最大连接数,不会达到 5w 个连接这么夸张的数目。但是由于事务太多,连接池中的连接数目有限,事务被放入连接池的阻塞队列等待执行,也会导致耗时增加。

基于阻塞队列纯手写实现数据库连接池 blog.csdn.net/u011583316/…

这篇文章里可以看到,mysql 客户端连接池和线程池类似,也有阻塞队列

mysql server

  1. sql 的 foreach 性能消耗,主要看执行一条 sql 还是多条 sql。
  2. 即使一条 sql,mysql server 操作存储引擎也是分多次的,每次 mysql server 调用存储引擎取出一行,然后再调用存储引擎取下一行。

image-20221014133436487

截图来自:01.基础架构:一条SQL查询...句是如何执行的?-- 《MySQL 实战 45 讲--丁奇》