使用大型mysql数据库改进查询UPDATE

时间:2014-03-20 00:56:37

标签: php mysql database sql-update bigdata

我尝试使用以下查询尝试更新我非常强大的数据库(近300万行):

$length = strlen($this);

$query = "UPDATE database 
SET row_to_update='1' 
WHERE row='{$this}' 
AND row_length='{$length}' 
LIMIT 1";

它从文件中获取单词($ this)(相当多),然后搜索匹配项。如果找到,则更新row_to_update,其值为1(默认设置为none)。

每个row_length都包含某个单元格的长度值,我认为这可能会显着加快进程。可悲的是,它没有。

它在8h内只管理约30k个查询。至少可以说,这很慢!

有什么办法,我可以改进这段低效的代码吗?

1 个答案:

答案 0 :(得分:1)

尝试收集一堆您正在寻找和使用的价值

UPDATE table SET row_to_update='1' WHERE row IN ({$my_values});

您可以使用EXPLAIN <your_query>EXPLAIN EXTENDED ..检查它是否使用索引,并调整查询或创建索引以加快速度。使用相同的SELECT条件与WHERE一起玩。

你可以使用更多:

SET profiling = 1;
<your query goes here>
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;

如果它不在dev上,请小心。 ENV。

考虑使用您感兴趣的值填充临时表并以这种方式使用它:

UPDATE table SET row_to_update='1' WHERE row in (SELECT values FROM my_temp_table);

当你到达那里时,你可以改进它:

UPDATE table INNER JOIN temp_table ON table.row = temp_table.row SET row_to_update = '1';

<强>实施例

正如你要求的例子。 Lat说example表代表你的原始表,其中包含大量数据。在这个例子中,我只使用4行:

mysql> select * from example;
+----+------+
| id | data |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+
4 rows in set (0.00 sec)

假设您要查找包含数据=&#39; a&#39;,&#39; b&#39;或&#39; c&#39; 您可以通过3种方式完成此任务:

1)SELECT ... IN(列表)

mysql> select id from example where data in ('a', 'b', 'c');
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)

2)SELECT ... IN(SELECT ... FROM temp_table)

mysql> select * from temp_table;
+----+------+
| id | data |
+----+------+
| 10 | foo~ |
| 11 | a    |
| 12 | bar  |
| 13 | baz  |
| 14 | b    |
| 15 | c    |
+----+------+
6 rows in set (0.00 sec)

mysql> select id from example where data in (SELECT data from temp_table);
[..]
3 rows in set (0.00 sec)

3)SELECT ... INNER JOIN temp_table ...

mysql> select example.id from example inner join temp_table on example.data = temp_table.data;
[..]
3 rows in set (0.01 sec)

当您准备就绪时,请使用相同条件的UPDATE来应用您喜欢的更改。