Mysql 努力维护查询。然而,如果我可以查询实时数据,这将是我的第二选择

Mysql 努力维护查询。然而,如果我可以查询实时数据,这将是我的第二选择,mysql,sql,sql-optimization,Mysql,Sql,Sql Optimization,3。投票期间更新统计数据 为了完整起见,我将此包含在内,但恳请您不要使用此方法。您可以在应用程序层或通过触发器来实现这一点,尽管它允许查询最新数据,而不必查询“生产”表,但它是开放的错误,我从来没有遇到过真正提倡这种方法的人。对于每一次投票,您都需要执行插入/更新逻辑,这将把一个非常快速的插入查询转变为一个更长的过程,这取决于您如何进行维护,这是有机会的(尽管并发问题很少) 4。上述因素的组合 您可以始终拥有与投票表格式相同的两个表,以及解决方案2中规定的一个表,一个投票表仅用于存储今天的投票,

3。投票期间更新统计数据

为了完整起见,我将此包含在内,但恳请您不要使用此方法。您可以在应用程序层或通过触发器来实现这一点,尽管它允许查询最新数据,而不必查询“生产”表,但它是开放的错误,我从来没有遇到过真正提倡这种方法的人。对于每一次投票,您都需要执行插入/更新逻辑,这将把一个非常快速的插入查询转变为一个更长的过程,这取决于您如何进行维护,这是有机会的(尽管并发问题很少)

4。上述因素的组合


您可以始终拥有与投票表格式相同的两个表,以及解决方案2中规定的一个表,一个投票表仅用于存储今天的投票,另一个用于存储历史投票,并且仍然维护一个汇总表,然后您可以将今天的数据与汇总表合并,以获得最新结果,而无需查询大量数据。同样,这是额外的维护,更容易出错

是的,我会照你说的做:当有人投票时,修改缓存的表,而不是从头开始重新计算所有统计数据。如果时间紧迫,请按计划脱机执行长查询,并缓存结果——因此,如果需要10分钟,那么短期内,您将不得不忍受最多10分钟的结果。这对于这个数据集来说可能不是问题,这取决于数据的活跃程度。投票表上有哪些索引?若你们的表被正确地索引了,那个么200k条记录并不多。@GarethD,好吧,执行第二个例子中的查询已经需要2秒钟了。不确定它是否会扩展,我仍然在做适当的测试过程中,因为缺乏知识。无论如何谢谢。我喜欢这个主意!组合,因为您有
createdAt
时间戳。附加提示:将您的SELECT变成脏读(无事务性),因为在任何情况下,当它们击中最终用户的眼球时,计数都是脏的。非常感谢。这正是我一直在寻找的答案。尽管我忘了包括索引(我在编辑中添加了索引),但这几乎完全解决了这个问题。再次感谢。
mysql> SELECT * FROM Meta;
+-------------+-------+
| Key         | Value |
+-------------+-------+
| TRACK_COUNT | 2620  |
| VOTE_COUNT  | 3821  |
| USER_COUNT  | 371   |
+-------------+-------+
mysql> SHOW INDEXES IN Vote;
+-------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name                | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Vote  |          0 | UNIQUE_UserId_TrackHash |            1 | UserId      | A         |         890 |     NULL | NULL   |      | BTREE      |         |
| Vote  |          0 | UNIQUE_UserId_TrackHash |            2 | TrackHash   | A         |        4450 |     NULL | NULL   |      | BTREE      |         |
| Vote  |          1 | INDEX_TrackHash         |            1 | TrackHash   | A         |        4450 |     NULL | NULL   |      | BTREE      |         |
| Vote  |          1 | INDEX_CreatedAt         |            1 | CreatedAt   | A         |        1483 |     NULL | NULL   |      | BTREE      |         |
| Vote  |          1 | UserId                  |            1 | UserId      | A         |        1483 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

mysql> SHOW INDEXES IN Track;
+-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Track |          0 | PRIMARY        |            1 | Hash        | A         |        2678 |     NULL | NULL   |      | BTREE      |         |
| Track |          1 | INDEX_Likes    |            1 | Likes       | A         |          66 |     NULL | NULL   |      | BTREE      |         |
| Track |          1 | INDEX_Dislikes |            1 | Dislikes    | A         |          27 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
SELECT  V.TrackHash, SUM(V.Vote) AS VotesTotal
FROM    Vote V
WHERE   V.CreatedAt > NOW() - INTERVAL 1 MONTH AND V.Vote = 'up'
GROUP BY V.TrackHash
CREATE TABLE VoteArchive
(       TrackHash           CHAR(40) NOT NULL,
        CreatedDate         DATE NOT NULL,
        AppMadeUpVotes      INT NOT NULL,
        AppMadeDownVotes    INT NOT NULL,
        ImportedUpVotes     INT NOT NULL,
        ImportedDownVotes   INT NOT NULL,
        MergedUpVotes       INT NOT NULL,
        MergedDownVotes     INT NOT NULL,
    PRIMARY KEY (CreatedDate, TrackHash)
);
INSERT VoteArchive
SELECT  TrackHash,
        DATE(CreatedAt),
        COUNT(CASE WHEN Vote = 'Up' AND Type = 0 THEN 1 END),
        COUNT(CASE WHEN Vote = 'Down' AND Type = 0 THEN 1 END),
        COUNT(CASE WHEN Vote = 'Up' AND Type = 1 THEN 1 END),
        COUNT(CASE WHEN Vote = 'Down' AND Type = 1 THEN 1 END),
        COUNT(CASE WHEN Vote = 'Up' AND Type = 2 THEN 1 END),
        COUNT(CASE WHEN Vote = 'Down' AND Type = 2 THEN 1 END)
FROM    Votes
WHERE   CreatedAt > DATE(CURRENT_TIMESTAMP)
GROUP BY TrackHash, DATE(CreatedAt);