代码之家  ›  专栏  ›  技术社区  ›  Maximus

优化分析的SQL查询

  •  0
  • Maximus  · 技术社区  · 15 年前

    我已经实施了分析系统,现在表现非常差。为了解释它,我需要解释表结构查询

    我有两张InnoDB表

    表1:包含有关每小时统计的记录(统计数据、文件、时间) 表2:包含超过800万行。

    表2结构为

    full_stats (
        stats_id Int
        file_id Int
        stats_week Int
        stats_month Int
        stats_year Int
        stats_time DATETIME
    

    )

    我要做的是计算给定时间段内的每小时统计的总视图,并按文件ID对记录分组,然后将记录添加/更新到完整的统计表中。在AVG上,处理一行需要1-2分钟。我正在尝试优化查询以获得更好的性能。

    这就是我要做的

    在给定的一周、一个月和一年中,有60%的几率文件ID已经以完整的状态存在,40%的几率文件ID不存在。

    所以在第一个查询中,我尝试使用以下查询更新记录

    UPDATE full_stats 
       SET total_views=XXX 
     WHERE stats_week=XX stats_month=X 
       AND stats_year=YYYY
    

    之后,我检查受影响的行是否为零,然后插入记录。插入或更新完成后,将根据文件ID和给定的时间段删除每小时\统计数据中的记录。

    您能给我一些如何优化查询和降低锁定率的建议吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   fancyPants    9 年前

    每次插入/更新后,必须重写或更新索引时,索引会导致性能不佳。这更有可能是常规索引。
    然而,在您的情况下,听起来您无论如何都需要一个唯一的索引。有了这个,你可能不会有这个问题(那么多)。

    确保您的表使用InnoDB引擎并在 (stats_year, stats_month, stats_week) .

    然后,不用先进行更新,然后检查受影响的行并在必要时插入,而是使用 INSERT...ON DUPLICATE KEY UPDATE . 这样,在40%的情况下,您省去了前面的更新语句。
    但是请注意,唯一索引对于这个声明是至关重要的!