优化查询

时间:2012-06-12 13:11:38

标签: php mysql sql loops

我有大约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());
  }

4 个答案:

答案 0 :(得分:3)

以下是一些有助于优化的方法:

  • 尝试获取meta_value以外的ID,并且在使用更新时只需要访问ID。
  • 检查您是否确实需要使用整个通配符,或者可以将其发布或添加前缀。

意义:

#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'; 
  • 确保使用正确的数据类型,varchars是正确的大小,使用int而不是BigInt等。
  • 尝试将查询移动到存储过程,编译存储过程(SQL代码不是),使它们比SQL代码更快。

答案 1 :(得分:2)

尝试在'meta_key'上添加索引,并尝试使用LIKE进行这些操作。你为什么需要这里?具体要求是什么?

答案 2 :(得分:2)

除了存储第一个查询中的主键并在更新中使用它们之外,您还可以创建一个临时表,对该表执行批量插入,然后在主表上进行连接更新。

这样,您就不必在循环中运行查询。

Creating Temporary Tables

答案 3 :(得分:1)

我不是一个php人,但在sql方面我可以给你一些建议。你可以做一些事情,

您的SQL语句是,

SELECT meta_value FROM my_table WHERE meta_key =' key' AND meta_value LIKE'%something%'

你可以做的事情是,

  1. 在密钥字段上添加索引。 您的查询中有两个归档meta_key,meta_value,尝试为两者添加复合索引或单独索引。

  2. 查询 现在检查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'