加快特定查询的方法

时间:2011-01-20 15:32:36

标签: sql mysql

我有一个现有的sql查询,它运行良好,但我认为这对于这么小的结果集需要相当多的时间和资源。我试图弄清楚以下查询是否可以通过我不熟悉的方式进行优化以获得更好的性能。

查询

SELECT
    a.programname, count(b.id)
FROM
    groups a
LEFT JOIN
    selections b ON (a.id_selection = b.id AND a.min_age = 18 AND a.max_age = 24)
LEFT JOIN
    member_info c ON (b.memberid = c.memberid AND (c.status = 1 OR c.term_date > '2011-01-31'))
WHERE
    a.flag = 3
GROUP BY
    a.programname
ORDER BY
    a.programid asc;

这里有三张表:

群组 - A

组包含成员可以选择的程序列表。成员可以在整个表中进行多项选择,但每个程序名只能有一个选择,只有一个年龄段。整个节目由旗帜决定,该旗帜将400多个节目限制为仅说100种可能的混音。组合在一起的程序名称是:

仅限会员,会员加配偶,会员加儿童,家庭

结果集必须返回具有该特定选择的所有活动成员的计数,即使结果为0(即不能将结果集限制为3行,因为一个计数为零)。

选择

此表将成员选择分组到多个组选择。一个成员可以从组中拥有多个ID,但每种类型只有一个。

Member_info

包含有关每个特定成员的信息,包括他们的状态(1是活动的)以及他们的活动时是否通过了他们的终止日期。

我的查询需要将近3/4的完整秒数,我觉得这段时间的信息太多了,但也许我可能会错误地使用所有必要的连接。

非常感谢任何帮助。如有必要,我可以进一步扩展我的问题。

EXPLAIN详情

1   SIMPLE  a   ALL                 184 Using where; Using temporary; Using filesort
1   SIMPLE  b   index       memberid_id 7       3845    Using index
1   SIMPLE  c   ALL                 1551    

关于索引建议的编辑

我已经考虑过使用有关此查询的索引,但几乎所有来源都会建议,在这样的示例中使用可能实际上是有害的。我发现的最好的总结是:

  

索引是你的另外一点   可以在你的MySQL表上启用   提高性能,但他们确实有   一些缺点。当你创建一个新的   索引MySQL构建一个单独的块   需要更新的信息   每次都有变化   桌子。这意味着,如果你是   不断更新,插入和   删除表中的条目   可能会对...产生负面影响   性能

member_information表每天都会增长,这些组将保持相当稳定,但选择表每天都会发生巨大变化。因此,在这种情况下,索引的使用似乎确实会产生负面影响。

3 个答案:

答案 0 :(得分:1)

您是否在要加入的列上有索引?这显然是第一步。

答案 1 :(得分:1)

此查询似乎没有问题。你的选择是

  • 使用索引:如果您打算阅读的方式多于写入
  • 使用参数化查询,以便db引擎可以缓存执行计划以便重用

除此之外,系统中必定存在严重的瓶颈或表中数百万行导致长时间执行。

如果你并行运行100次查询,你如何查询执行?

答案 2 :(得分:0)

如果经常运行此查询,请尝试使用绑定参数而不是仅连接sql。这样,db引擎就可以缓存执行计划。