mysql - 是否创建新的数据库连接?

标签 mysql database optimization

我正在运行一个 cron 作业(每 15 分钟一次),执行大约需要一分钟。它进行大量 API 调用并将数据存储到数据库中。

现在我在开始时创建一个 mysql 连接,并在整个代码中使用相同的连接。大部分时间都花在进行 API 调用上。

只有在存储数据时才创建一个新的数据库连接会更有效率吗(如下)?

  1. 终止最后一个连接
  2. 等待 API 调用完成
  3. 创建新的数据库连接
  4. 执行查询
  5. 转到 1

[编辑] 这是 MYSQL 报告。我是 mysql 的新手 - 是否有任何理由根据以下报告重新连接到数据库?

  1 MySQL 5.1.26-rc-5.1.26r  uptime 0 1:8:58        Tue Jun 15 21:25:03 2010
  2
  3 __ Key _________________________________________________________________
  4 Buffer used    33.00k of  24.00M  %Used:   0.13
  5   Current       4.52M            %Usage:  18.84
  6 Write hit      33.33%
  7 Read hit       69.16%
  8
  9 __ Questions ___________________________________________________________
 10 Total           1.75k     0.4/s
 11   COM_QUIT    319.92k    77.3/s  %Total: 18312.
 12   -Unknown    319.90k    77.3/s          18311.
 13   DMS           1.53k     0.4/s           87.58
 14   Com_            199     0.0/s           11.39
 15   QC Hits           1     0.0/s            0.06
 16 Slow              144     0.0/s            8.24  %DMS:   9.41
 17 DMS             1.53k     0.4/s           87.58
 18   SELECT        1.22k     0.3/s           69.83         79.74
 19   INSERT          155     0.0/s            8.87         10.13
 20   UPDATE          155     0.0/s            8.87         10.13
 21   REPLACE           0       0/s            0.00          0.00
 22   DELETE            0       0/s            0.00          0.00
 23 Com_              199     0.0/s           11.39
 24   check            86     0.0/s            4.92
 25   show_status      41     0.0/s            2.35
 26   set_option       23     0.0/s            1.32
 27
 28 __ SELECT and Sort _____________________________________________________
 29 Scan              653     0.2/s %SELECT:  53.52
 30 Range               0       0/s            0.00
 31 Full join           0       0/s            0.00
 32 Range check         0       0/s            0.00
 33 Full rng join       0       0/s            0.00
 34 Sort scan           0       0/s
 35 Sort range        590     0.1/s
 36 Sort mrg pass       0       0/s
 37
 38 __ Query Cache _________________________________________________________
 39 Memory usage   43.57k of  12.00M  %Used:   0.35
 40 Block Fragmnt  25.35%
 41 Hits                1     0.0/s
 42 Inserts           916     0.2/s
 43 Insrt:Prune     916:1     0.2/s
 44 Hit:Insert     0.00:1        
 45
 46 __ Table Locks _________________________________________________________
 47 Waited              0       0/s  %Total:   0.00
 48 Immediate       1.65k     0.4/s
 49
 50 __ Tables ______________________________________________________________
 51 Open               47 of 1024    %Cache:   4.59
 52 Opened             54     0.0/s
 53
 54 __ Connections _________________________________________________________
 55 Max used            3 of   60      %Max:   5.00
 56 Total         319.92k    77.3/s
 57
 58 __ Created Temp ________________________________________________________
 59 Disk table          2     0.0/s
 60 Table              28     0.0/s
 61 File                5     0.0/s
 62
 63 __ Threads _____________________________________________________________
 64 Running             3 of    3
 65 Cached              0 of    4      %Hit:    100
 66 Created             3     0.0/s
 67 Slow                0       0/s
 68
 69 __ Aborted _____________________________________________________________
 70 Clients             0       0/s
 71 Connects      319.86k    77.3/s
 72
 73 __ Bytes _______________________________________________________________
 74 Sent           52.36M   12.7k/s
 75 Received       23.17M    5.6k/s

最佳答案

断开连接并重新建立它们很少有好处。与数据库建立连接通常是一个相当繁重的过程。许多应用程序创建连接池只是为了避免这种情况:建立一些合理数量的连接,然后将它们保留很长时间,甚至可能永远保留,让每个线程或用户在需要时从池中获取连接,然后再将它们归还.

如果您遇到连接孤立的问题——查询失败并且您永远无法释放连接——真正的解决方案是实现适当的异常处理,这样就不会发生这种情况。

如果您有一个线程处于非事件连接状态,而其他线程因数据库达到其连接最大值而失败,那么,是的,您需要考虑释放连接。

旁注:MySQL 声称它可以非常快速地建立连接,因此与其他数据库引擎相比,这不是一个问题。我从未对此进行过基准测试。

关于mysql - 是否创建新的数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051083/

相关文章:

database - 数据库与微服务的一致性

optimization - CUDA 32 位整数运算在开普勒上比麦克斯韦更快?

c++ - 有什么方法可以禁用特定代码行的编译器优化?

mysql - 导入数据库时​​ PMA-SQL-ERROR

mysql - 从 Mysql 中清除电子邮件地址

php - 创建表查询给我 "table does not exists"错误

java - 想要使用 Java 和 Flex 从数据库中提取数据

MySQL全文搜索找不到单个拼写错误

php - SQL Server 的插入忽略的替代方案

haskell - 为什么 Prelude.drop 比普通的快?