加速大量的mysql更新和插入

rg8*_*g88 9 php mysql

我有一个应用程序需要更新大量条目上的大量数据.基本上它会进行7,000次插入和/或更新,但需要花费很长时间(比如差不多9分钟......平均每次查询大约0.08秒).基本上我正在寻找一般的加速来提出多个这样的请求(我不期待我的模糊例子的具体答案......这只是希望,有助于解释).

以下是分析请求的一些示例:

SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (timestamp = '2010-10-15T07:30:00-07:00') AND (planet_id = '2010_Gl_581_c')

INSERT INTO `habitable_planets` (`planet_id`, `timestamp`, `weather_air_temp`, `weather_cell_temp`, `weather_irradiance`, `weather_wind_float`, `biolumin_to_date`, `biolumin_detected`, `craft_energy_usage`, `craft_energy_consumed_to_date`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (timestamp = '2010-10-15T07:45:00-07:00') AND (planet_id = '2010_Gl_581_c')

INSERT INTO `habitable_planets` (`planet_id`, `timestamp`, `weather_air_temp`, `weather_cell_temp`, `weather_irradiance`, `weather_wind_float`, `biolumin_to_date`, `biolumin_detected`, `craft_energy_usage`, `craft_energy_consumed_to_date`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

重复广告恶心(好吧,约7,000次).这是一个更新,它收集24小时内间隔生成的数据,然后每天对数据库进行一次大量更新.鉴于我所展示的有限位,你有什么建议加快这个过程吗?

例如......是否有意义,而不是为每个时间戳做一个选择,一次选择一个范围,然后在脚本中迭代它们?

模糊地说:

SELECT `habitable_planets`.* FROM `habitable_planets` WHERE (planet_id = '2010_Gl_581_c')
Run Code Online (Sandbox Code Playgroud)

将结果分配给$foo然后执行:

foreach ($foo as $bar)
{
    if ($bar['timestamp'] == $baz) // where $baz is the needed timestamp
    {
    // do the insert here
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:为此添加一点,在我的情况下改善响应性的一件事是更改一堆检查现有记录的代码,并根据结果使用INSERT... ON DUPLICATE KEY UPDATEsql查询进行插入或更新.在我的特定情况下,这导致了大约30%的速度增益,因为它减少了至少一次数据库之外的数量,并且实际上增加了数千个请求.

Nav*_*eed 16

一些有用的链接:

来自MySQL文档:

INSERT语句的速度说:

  • 如果要同时从同一客户端插入多行,请使用带有多个VALUES列表的INSERT语句一次插入多行.与使用单独的单行INSERT语句相比,这要快得多(在某些情况下要快很多倍).如果要将数据添加到非空表,则可以调整bulk_insert_buffer_size变量以使数据插入更快.

  • 如果多个客户端插入了大量行,则可以使用INSERT DELAYED语句获得更高的速度.

  • 对于MyISAM表,如果数据文件中间没有已删除的行,则可以使用并发插入在SELECT语句运行的同时添加行.

  • 从文本文件加载表时,请使用LOAD DATA INFILE.这通常比使用INSERT语句快20倍.

  • 通过一些额外的工作,当表有许多索引时,可以使MyISAM表的LOAD DATA INFILE运行得更快.