拆分 MySQL 中的数据以使其更快、更易于访问

Splitting up data in MySQL to make it faster and more accessible

我有一个 MySQL 数据库,它变得非常大。我能感觉到网站因此变慢了。

现在,在很多页面上我只需要特定部分的数据。例如,为了历史记录,我每 5 分钟存储一次有关用户的信息。但是在一页上我只需要最新的信息(而不是整个数据历史)。我在查询中通过一个简单的 MAX(date) 实现了这一点。

现在我想知道是否单独制作一个只存储最新数据的 table 会不会更好,这样查询就不必搜索特定用户的最新数据在数百万行之间,而是只有一个 table,其中只有来自每个用户的最新数据。

处理此类问题的常用方法有哪些?

有很多方法可以处理大型 table 中的慢速查询。最基本的三种方式是:


1:在大的table上使用indexes, and use them correctly. It is important to avoid table scans;这几乎总是您对单个查询的最大性能影响。

例如,如果您查询的内容类似于:select max(active_date) from activity where user_id=?,则 activity table 上的 create an index 用于 user_id 列。一个索引中可以有多个列,table 上可以有多个索引。

CREATE INDEX idx_user ON activity (user_id)

2:使用摘要/"cache" tables。这就是你的建议。在您的情况下,您可以将插入 trigger 应用到 activity table,这将在插入新行时更新您的摘要 table。这意味着您不需要代码来执行两个查询。例如:

CREATE TRIGGER update_summary 
AFTER INSERT ON activity 
FOR EACH ROW
UPDATE activity_summary SET last_active_date=new.active_date WHERE user_id=new.user_id

您可以更改它以检查用户是否已经存在一行,如果是他们的第一行则执行插入 activity。或者,您可以在用户注册时在摘要 table 中插入一行……或其他任何内容。


3: 查看查询!使用 MySQL 的 EXPLAIN 命令获取查询计划以查看优化器对您的查询做了什么。使用它来确保优化器避免对大型 table 进行 table 扫描(并在必要时创建或强制索引)。