【问题标题】:Optmizing query优化查询
【发布时间】:2012-06-15 09:07:04
【问题描述】:

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

【问题讨论】:

  • 您是否尝试将第一个查询中的 pkey 存储在一个数组中,然后使用 IN() 子句而不是 LIKE 进行更新?
  • 考虑使用 MongoDB,而不是 SQL 来处理如此大量的数据
  • 70 000 行数据量并不大。
  • @redskins 如果您认为 70k 行是“大量数据”,那么您不应该在这里发表评论。
  • @redskins80:如果每秒添加 70,00 行,那么我建议“这是大量数据”

标签: php mysql sql loops


【解决方案1】:

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

  • 尝试获取除了 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 代码更快。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      Creating Temporary Tables

      【讨论】:

        【解决方案4】:

        我不是 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'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-25
          • 2011-01-19
          • 1970-01-01
          相关资源
          最近更新 更多