针对分析的优化SQL查询

时间:2010-08-13 15:55:34

标签: mysql

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

我有两个innodb表

表1:包含有关每小时统计数据的记录(stats_id,file_id,time) 表2:包含超过800万行。

表2结构是

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

我要做的是计算给定时间段内hourly_stats的总视图,并按file_id对记录进行分组,然后将记录添加/更新到full_stats表。平均而言,处理一行需要1-2分钟。我正在尝试优化查询以获得更好的性能。

这就是我正在做的事情

在给定的一周,一个月和一年中,full_stats中有60%的可能性存在file_id,并且有40%的可能性它不存在。

所以在第一个查询中我尝试使用查询

更新记录
UPDATE full_stats 
   SET total_views=XXX 
 WHERE stats_week=XX stats_month=X 
   AND stats_year=YYYY

之后我检查受影响的行是否为零然后我插入记录。完成插入或更新后,将根据file_id和给定的时间段删除hourly_stats中的记录。

您能否给我任何建议如何优化查询并降低锁定率?

1 个答案:

答案 0 :(得分:1)

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

确保您的表使用InnoDB引擎并在(stats_year, stats_month, stats_week)上有唯一索引。

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