【问题标题】:Mysql optimization issueMysql优化问题
【发布时间】:2013-02-14 08:49:59
【问题描述】:

你猜为什么这个语句在处理 300 000 行时花费了太长时间。基本上这个查询是用来查找重复的。

SELECT DISTINCT 
    a.Id,
    b.Id as sid
FROM 
    csv_temp a
INNER JOIN 
    csv_temp b ON a.firstname = b.firstname AND 
    a.lastname = b.lastname  AND 
   ((a.address = b.address) OR 
    (a.zip = b.zip) OR 
    (a.city = b.city AND a.state = b.state) )
WHERE 
    a.Id <> b.Id AND 
    a.status=2 AND 
    b.status=1 AND 
    a.flag !=1 AND 
    b.flag !=1

【问题讨论】:

  • 尝试为所有这些列组合添加索引。
  • 显示查询说明 + 建表查询
  • 如果你使用百万而不是十万会更好。谢谢
  • 所有比较的列都被索引了吗?
  • 是的,我已经添加了所有索引

标签: mysql query-optimization


【解决方案1】:

OR 的性能似乎通常很差,在 JOIN 条件下,我预计情况会更糟。尝试使用 3 个 SELECT(每个 ORed 条件一个)并将结果合并在一起。如果这样做,怀疑也不需要 DISTINCTS:-

SELECT  
    a.Id,
    b.Id as sid
FROM 
    csv_temp a
INNER JOIN 
    csv_temp b ON a.firstname = b.firstname AND 
    a.lastname = b.lastname  AND 
   a.address = b.address
WHERE 
    a.Id <> b.Id AND 
    a.status=2 AND 
    b.status=1 AND 
    a.flag !=1 AND 
    b.flag !=1
UNION
SELECT  
    a.Id,
    b.Id as sid
FROM 
    csv_temp a
INNER JOIN 
    csv_temp b ON a.firstname = b.firstname AND 
    a.lastname = b.lastname  AND 
    a.zip = b.zip
WHERE 
    a.Id <> b.Id AND 
    a.status=2 AND 
    b.status=1 AND 
    a.flag !=1 AND 
    b.flag !=1
UNION
SELECT  
    a.Id,
    b.Id as sid
FROM 
    csv_temp a
INNER JOIN 
    csv_temp b ON a.firstname = b.firstname AND 
    a.lastname = b.lastname  AND 
    a.city = b.city AND a.state = b.state
WHERE 
    a.Id <> b.Id AND 
    a.status=2 AND 
    b.status=1 AND 
    a.flag !=1 AND 
    b.flag !=1

【讨论】:

    【解决方案2】:

    现在在比较中使用的列上添加索引后使用解释计划检查

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多