【问题标题】:Query optimization with a large number of records有大量记录的查询优化
【发布时间】:2014-04-08 22:40:45
【问题描述】:

我有几张表,每张表都有数百万条记录。其中一个表有一个潜在客户数据(带有 clicks 表中的 click_id 字段)。第二个(点击)具有 click_id 作为主键并具有 ad_id 字段(广告标签)。看起来像:

X_leads

身份证
领导ID
线索点击ID
另一个字段

X_click

click_id
ad_id
另一个字段

我需要获取包含潜在客户数量和我需要的 ad_id 标签的数据。
我有一个类似的查询:

SELECT C.ad_id AS lead_ad_id, COUNT(DISTINCT L.lead_id) AS leads
FROM X_leads AS L
INNER JOIN X_click AS C ON L.lead_click_id=C.click_id
WHERE (C.shop_id=223) AND (L.owner_id=223)
AND (L.lead_active=1) AND (L.lead_invalid=0)
AND (C.ad_id IN (11, 180, 181, ... {it can be hundred of ids}...))
GROUP BY L.lead_ad_id
今天,一个查询可以工作 10 秒或更长时间。
我尝试自己优化它,但没有任何结果。

解释结果:



如何优化此查询?
谢谢

【问题讨论】:

  • 通过提供适当的 DDL 和解释
  • 大的IN 子句有什么用?可以用JOIN 代替吗?您的查询中有一些列不在您的架构中。提供完整的架构,包括索引。
  • IN 有一个广告标签的 IDS。用户可以通过单击复选框来选择它。 (可以是 1 或 200)
  • @MarcusAdams 正如我所说,IN 有一个广告标签的 IDS,可以在表单中选择用户。我们不能用 JOIN 代替它。 X_click 表中的 ad_id 列。我无法显示完整的架构 - 它有很多表。

标签: mysql sql optimization group-by


【解决方案1】:

使用 explain_plan 并避免全表扫描,以避免它强制索引与您在 where 条件中使用的字段。 http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多