我尝试使用以下查询尝试更新我非常强大的数据库(近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个查询。至少可以说,这很慢!
有什么办法,我可以改进这段低效的代码吗?
答案 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来应用您喜欢的更改。