2

我有大约 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

4 回答 4

3

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

  • 尝试获取 meta_value 之外的 ID,并且在使用 update 时仅引用 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 代码更快。
于 2012-06-12T13:20:59.970 回答
2

尝试在 'meta_key' 上放置一个索引,并尝试解决必须使用 LIKE 进行这些操作的问题。为什么在这里需要 LIKE?具体要求是什么?

于 2012-06-12T13:17:03.873 回答
2

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

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

创建临时表

于 2012-06-12T13:18:29.680 回答
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:从 my_table WHERE meta_key = 'key' 中选择 meta_value

    如果 Q1 返回的行数比 Q2 SQL 语句多,那么您的 SQL 应该如下所示,

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

于 2012-06-12T13:18:30.237 回答