3

我有这个查询(我没有写),它对客户端运行良好,直到表中的行数超过几千行,现在仅 4200 行需要 40 秒以上。

关于如何优化并获得相同结果的任何建议?

我尝试了其他一些方法,但没有得到这个较慢的查询返回的正确结果......

SELECT COUNT(*) AS num
  FROM `fl_events`
  WHERE id IN(
    SELECT DISTINCT (e2.id)
      FROM `fl_events` AS e1, fl_events AS e2
      WHERE e1.startdate >= now() AND e1.startdate = e2.startdate
  )
  ORDER BY `startdate`

任何帮助将不胜感激!

4

3 回答 3

5

从所需的明显索引来看,我真的不明白为什么你要加入你的表来选择IN条件。ORDER BY也不需要。你确定你的查询不能这样写吗?:

SELECT COUNT(*) AS num
FROM `fl_events` AS e1
WHERE e1.startdate >= now() 
于 2012-06-06T20:46:54.253 回答
0

我不认为重写查询会有所帮助。您问题的关键是“直到表格超过几千行”。这意味着重要的列没有被索引。在一定数量的记录之前,所有数据都适合单个内存块 - 在那个点上,它需要一个新块。而索引是加快搜索速度的唯一方法。

首先 - 检查 fl_events 中的 ID 是否实际标记为主键。这对记录进行物理排序,如果没有它,您可能会看到数据损坏和偶尔超慢的结果。在查询中使用 distinct 使其看起来可能不是唯一值。这会带来问题。

然后,确保在 start_date 上添加索引。

于 2012-06-06T20:41:15.167 回答
0

缓慢可能与事件表与自身的连接有关,并且可能与 startdate 没有索引有关。

于 2012-06-06T20:42:20.400 回答