拆分 MySQL 中的数据以使其更快、更易于访问
Splitting up data in MySQL to make it faster and more accessible
我有一个 MySQL 数据库,它变得非常大。我能感觉到网站因此变慢了。
现在,在很多页面上我只需要特定部分的数据。例如,为了历史记录,我每 5 分钟存储一次有关用户的信息。但是在一页上我只需要最新的信息(而不是整个数据历史)。我在查询中通过一个简单的 MAX(date)
实现了这一点。
现在我想知道是否单独制作一个只存储最新数据的 table 会不会更好,这样查询就不必搜索特定用户的最新数据在数百万行之间,而是只有一个 table,其中只有来自每个用户的最新数据。
这里的缺点是我必须每 5 分钟 运行 2 次查询才能在我的数据库中插入最新的历史记录,即在历史记录中插入新数据 table并更新最新历史中的数据table.
优点是 MySQL 要处理的数据要少得多。
处理此类问题的常用方法有哪些?
有很多方法可以处理大型 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 扫描(并在必要时创建或强制索引)。
我有一个 MySQL 数据库,它变得非常大。我能感觉到网站因此变慢了。
现在,在很多页面上我只需要特定部分的数据。例如,为了历史记录,我每 5 分钟存储一次有关用户的信息。但是在一页上我只需要最新的信息(而不是整个数据历史)。我在查询中通过一个简单的 MAX(date)
实现了这一点。
现在我想知道是否单独制作一个只存储最新数据的 table 会不会更好,这样查询就不必搜索特定用户的最新数据在数百万行之间,而是只有一个 table,其中只有来自每个用户的最新数据。
这里的缺点是我必须每 5 分钟 运行 2 次查询才能在我的数据库中插入最新的历史记录,即在历史记录中插入新数据 table并更新最新历史中的数据table.
优点是 MySQL 要处理的数据要少得多。
处理此类问题的常用方法有哪些?
有很多方法可以处理大型 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 扫描(并在必要时创建或强制索引)。