我有大约70 000行的表。我需要查找,更改和保存6000行(我必须经常这样做,每周很少)。当然,我这样做,并且它超过2分钟完成:(任何建议?:()
$query = mysql_query("SELECT meta_value FROM my_table WHERE meta_key = 'key' AND meta_value LIKE '%something%'")or die(mysql_error());
$new = "soemthing something";
while($row = mysql_fetch_array($query)){
$old = unserialize($row['meta_value']);
$new_meta_r = str_replace($old['color'],$new,$old);
$new_meta = serialize($new_meta_r);
$update_meta = mysql_query("UPDATE my_table SET meta_value = '$new_meta' WHERE meta_key = 'key' AND meta_value LIKE '%something%'")or die(mysql_error());
}
答案 0 :(得分:3)
以下是一些有助于优化的方法:
意义:
#Full wildcard
SELECT * FROM TABLE WHERE COLUMN LIKE '%something%';
#Postfix wildcard
SELECT * FROM TABLE WHERE COLUMN LIKE 'something%';
#Prefix wildcard
SELECT * FROM TABLE WHERE COLUMN LIKE '%something';
答案 1 :(得分:2)
尝试在'meta_key'上添加索引,并尝试使用LIKE进行这些操作。你为什么需要这里?具体要求是什么?
答案 2 :(得分:2)
除了存储第一个查询中的主键并在更新中使用它们之外,您还可以创建一个临时表,对该表执行批量插入,然后在主表上进行连接更新。
这样,您就不必在循环中运行查询。
答案 3 :(得分:1)
我不是一个php人,但在sql方面我可以给你一些建议。你可以做一些事情,
您的SQL语句是,
SELECT meta_value FROM my_table WHERE meta_key =' key' AND meta_value LIKE'%something%'
你可以做的事情是,
在密钥字段上添加索引。 您的查询中有两个归档meta_key,meta_value,尝试为两者添加复合索引或单独索引。
查询 现在检查where块中哪个子句返回更多行。把它放在另一个之前。
Q1:SELECT meta_value FROM my_table WHERE meta_value LIKE'%something%'
Q2:SELECT meta_value FROM my_table WHERE meta_key =' key'
如果Q1返回比Q2 SQL语句更多的行,那么你的SQL应该如下所示,
SELECT meta_value FROM my_table WHERE meta_value LIKE'%something%' AND meta_key =' key'