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


Improving a query UPDATE using large mysql databases

我正在尝试使用以下查询更新我的相当健壮的数据库(近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个查询。至少可以说,这是缓慢的!

有什么办法,我可以改善这一点低效的代码?

尝试收集一堆你正在寻找的值并使用

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

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

使用

可以获得更多信息
SET profiling = 1;
<your query goes here>
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;

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

也可以考虑用您感兴趣的值填充temp表,并以这种方式使用它:

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';

例子:

如你所要的例子。最后,假设example表代表您的原始表,其中包含大量数据。在本例中,我将只使用4行:

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

假设您正在查找data= 'a', 'b'或'c'的行id您可以通过以下三种方式实现:

1) SELECT…(列表)

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

2) SELECT…在(select…从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…

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

当你准备好使用UPDATE与相同的条件来应用你喜欢的更改