我已经实施了分析系统,现在表现非常糟糕。为了解释它,我需要解释表结构查询
我有两个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中的记录。
您能否给我任何建议如何优化查询并降低锁定率?
答案 0 :(得分:1)
在每次插入/更新后必须重写或更新索引时,索引会导致性能不佳。对于常规索引,这更有可能 但是,在您的情况下,听起来您无论如何都需要一个独特的索引。有了这个,你可能没有这个问题(那么多)。
确保您的表使用InnoDB引擎并在(stats_year, stats_month, stats_week)
上有唯一索引。
然后,不是先进行更新,而是检查受影响的行并在必要时插入,使用INSERT...ON DUPLICATE KEY UPDATE
。这样,在40%的情况下,您可以免除先前的更新声明
但请注意,唯一索引对于此声明至关重要!