【问题标题】:How to speed up C++ MySQL connector?如何加速 C++ MySQL 连接器?
【发布时间】:2022-02-01 02:45:59
【问题描述】:

我正在使用 C++ MySQL 连接器。

sql::Connection * db = nullptr;

try {
    db = get_driver_instance()->connect("tcp://localhost:3306", "admin", "admin");
    db->setSchema("test_db");
} 
catch(exception &e) {
    return 1;  
}

MySQL 连接器动态链接到应用程序。

LDFLAGS = -L/usr/local/mysql-connector-c++/lib64
LDLIBS = -lmysqlcppconn
CXXFLAGS = -Wall -Wextra -g -std=c++11 -O3

当我运行我的应用程序时,大约需要13 033 µs10 000 µs 只是这个与 MySQL 的连接。我也尝试使用静态库编译它,但没有帮助。

有什么方法可以加快数据库连接速度?

【问题讨论】:

  • 您是否为每个操作建立新连接?如果是这样,您可以考虑将它们汇集起来。
  • 不,连接只在应用启动时创建一次...
  • 请显示minimal reproducible example。我们无法告诉你如何优化我们看不到的代码
  • 建立连接所需的时间取决于 MySQL 服务器(以及连接速度)。这与您的应用程序运行速度无关,而是您正在连接的服务器更快。 MySQL服务器在哪里,你用什么认证方式连接。
  • 实际上我正在使用 MAMP(在 MacBook Pro 2017 上)进行测试。我添加了连接示例。

标签: c++ mysql performance optimization


【解决方案1】:

如何对服务器说:给我指向数据库连接的指针

MySQL 连接不能在进程之间共享。如果你的 C++ 进程在处理一个 http 请求时启动,它必须在那个时候打开一个新的 MySQL 连接。

更典型的情况是,高性能网络应用不会为每个 http 请求派生一个新进程。您正在使用 1990 年代的 CGI 协议设计代码并期望高性能,您应该更改您的架构。

例如,FastCGI 实现应该使用单个进程处理多个 http 请求。这样,您就可以使用一个连接池来为请求处理程序提供 MySQL 连接,而无需每次都重新打开连接。

要加速单个 MySQL 连接,请考虑:

  • 至少升级到 MySQL 5.7,以利用提高的连接速度。我以为我读到 8.0 进一步提高了这个速度,但我现在找不到这方面的参考。
  • 使用比 TCP/IP 连接更快的 UNIX 域套接字接口。将客户端连接到 MySQL 服务器时应该像使用“localhost”一样简单。
  • 如果您使用 TCP/IP,则设置选项skip_name_resolve

https://dev.mysql.com/doc/refman/8.0/en/host-cache.html 说:

如果您有一个非常慢的 DNS 和许多主机,您可以通过启用 skip_name_resolve 来禁用 DNS 查找,或者通过增加 host_cache_size 的值来增大主机缓存来提高性能。

【讨论】:

猜你喜欢
  • 2015-02-03
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2010-11-20
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多