使用大型mysql数据库改善查询更新

米哈尔

我正在尝试使用以下查询来更新我的功能强大的数据库(近300万行):

$length = strlen($this);

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

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

每个row_length已经包含某些单元格的长度值,我认为这可能会大大加快处理速度。可悲的是没有。

它在8小时内仅可管理约3万个查询。至少可以这么说,这很慢!

有什么办法可以改善这段效率低下的代码吗?

pawel7318

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

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;

如果不在开发人员上,请谨慎使用。环境

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

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)

假设您要查找的数据ID为data ='a','b'或'c'的行,您可以通过以下三种方式进行操作:

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(从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)选择... 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来应用所需的更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章