说明
- @author JellyfishMIX - github / blog.jellyfishmix.com
- LICENSE GPL-2.0
从 mysql 客户端发送到 mysql server
-
比如有 100 条 sql,如果不手动开启事务把这 100 条 sql 放在同一个事务中执行,那么这 100 条 sql 会分别在 100 个隐式事务中。每个事务占用一个连接,这样就占用了 100 个连接。
-
虽然 mysql 客户端有连接池,但是占用大量的连接会导致连接池中连接数量不够用,连接池会创建新的连接,有性能开销。而且如果每次请求都执行 100 条 sql,qps 500 的话,100 * 500 = 50000 个事务,需要 5w 个连接,这样创建的开销是很大的。
-
虽然 mysql 客户端连接池可以设置最小连接数/最大连接数,不会达到 5w 个连接这么夸张的数目。但是由于事务太多,连接池中的连接数目有限,事务被放入连接池的阻塞队列等待执行,也会导致耗时增加。
基于阻塞队列纯手写实现数据库连接池 https://blog.csdn.net/u011583316/article/details/89107394
这篇文章里可以看到,mysql 客户端连接池和线程池类似,也有阻塞队列
mysql server
- sql 的 foreach 性能消耗,主要看执行一条 sql 还是多条 sql。
- 即使一条 sql,mysql server 操作存储引擎也是分多次的,每次 mysql server 调用存储引擎取出一行,然后再调用存储引擎取下一行。
截图来自:01.基础架构:一条SQL查询…句是如何执行的?-- 《MySQL 实战 45 讲–丁奇》