ThinkingMonkey Asked: 2012-04-25 10:25:15 +0800 CST2012-04-25 10:25:15 +0800 CST 2012-04-25 10:25:15 +0800 CST 打开和关闭数据库连接的成本是多少? 772 CPU 密集型如何在 MySQL 中打开和关闭数据库连接(对于 Web 应用程序) ...当数据库软件在本地主机上时? ...当数据库软件在另一台机器上时? mysql database-design 4 个回答 Voted Best Answer RolandoMySQLDBA 2012-04-25T10:54:05+08:002012-04-25T10:54:05+08:00 考虑每个 DB 连接分配的内存量。哪些东西必须分配?根据MySQL 5.0 认证学习指南,第 357 页: 服务器为每个客户端连接维护几个缓冲区。一个用作与客户端交换信息的通信缓冲区。每个客户端都维护其他缓冲区,用于读取表并执行连接和排序操作。 哪些设置控制每个连接的缓冲区? 加入缓冲区大小 排序缓冲区大小 读取缓冲区大小 read_rnd_buffer_size tmp_table_size / max_heap_table_size net_buffer_length / max_allowed_packet 线程堆栈 当连接建立时,分配和释放这些缓冲区需要时间。不要忘记将这些值的总和乘以max_connections。作为旁注,请不要使用mysql_pconnect,因为 PHP 和 MySQL 的持久连接不能很好地相处。以下是有关此主题的两个信息链接: 打开 PHP Not Cleanly Closeing MySQL Connections on Apache Death 上的错误。 请求持久 ssh 连接。 在诸如 OLTP 之类的重读、重写环境中,这在 RAM 使用方面会很昂贵,并且可能由于操作系统中的交换而受到抑制。在低写入、低读取的网站上,我不会那么担心。 Aaron Bertrand 2012-04-25T10:37:18+08:002012-04-25T10:37:18+08:00 我不确定它的“成本更高”是否重要。这肯定比重复使用相同的连接更昂贵。您将观察到的情况取决于您是否正确使用连接池、池的饱和程度、盒子上的可用资源等。 一般来说,如果您正在执行循环以与数据库进行一些交互,那么重用相同的活动连接要比在循环中打开和关闭要好得多(我经常看到的反模式) . Dude 2012-04-25T14:21:18+08:002012-04-25T14:21:18+08:00 重复使用一个对象和拆除它并重新构建它之间的困境(两者都有优点和缺点)通常可以通过妥协来解决:缓存对象,但时间有限(即到期)。如果该对象被频繁访问,那么它就会不断被重用。但是,如果它有一段时间没有使用,那么到期机制就会处理它,迫使它在再次需要时重新创建。 系统可以为这些类型的缓存设置一个全局挂钩,当内存不足时调用该挂钩,这会触发所有缓存删除最近未使用的对象。 greenlitmysql 2016-02-17T20:23:41+08:002016-02-17T20:23:41+08:00 Mysql 使用线程缓存(thread_cache_size)缓存连接(或线程)。它的最大值是 100。当客户端关闭连接时,它会返回到缓存中。当新连接打开时,它会检查线程缓存。在非常繁忙的系统上,打开关闭连接可能会很昂贵,特别是如果您有长时间运行的查询。 https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html 如果你买得起Mysql Enterprise,你可以使用Mysql 5.6中实现的Thread Pool插件。
考虑每个 DB 连接分配的内存量。哪些东西必须分配?根据MySQL 5.0 认证学习指南,第 357 页:
哪些设置控制每个连接的缓冲区?
当连接建立时,分配和释放这些缓冲区需要时间。不要忘记将这些值的总和乘以max_connections。作为旁注,请不要使用mysql_pconnect,因为 PHP 和 MySQL 的持久连接不能很好地相处。以下是有关此主题的两个信息链接:
在诸如 OLTP 之类的重读、重写环境中,这在 RAM 使用方面会很昂贵,并且可能由于操作系统中的交换而受到抑制。在低写入、低读取的网站上,我不会那么担心。
我不确定它的“成本更高”是否重要。这肯定比重复使用相同的连接更昂贵。您将观察到的情况取决于您是否正确使用连接池、池的饱和程度、盒子上的可用资源等。
一般来说,如果您正在执行循环以与数据库进行一些交互,那么重用相同的活动连接要比在循环中打开和关闭要好得多(我经常看到的反模式) .
重复使用一个对象和拆除它并重新构建它之间的困境(两者都有优点和缺点)通常可以通过妥协来解决:缓存对象,但时间有限(即到期)。如果该对象被频繁访问,那么它就会不断被重用。但是,如果它有一段时间没有使用,那么到期机制就会处理它,迫使它在再次需要时重新创建。
系统可以为这些类型的缓存设置一个全局挂钩,当内存不足时调用该挂钩,这会触发所有缓存删除最近未使用的对象。
Mysql 使用线程缓存(thread_cache_size)缓存连接(或线程)。它的最大值是 100。当客户端关闭连接时,它会返回到缓存中。当新连接打开时,它会检查线程缓存。在非常繁忙的系统上,打开关闭连接可能会很昂贵,特别是如果您有长时间运行的查询。
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html 如果你买得起Mysql Enterprise,你可以使用Mysql 5.6中实现的Thread Pool插件。