2

运行 MySQL 数据库,所有表都是 InnoDB

每天晚上,我们都会通过批处理脚本通过电子邮件向我们发送一个最令人讨厌的慢查询列表。

在这个列表中有两个查询,一个插入和一个更新。

插入脚本记录用户的页面浏览量。为了提高效率,我们将只为会话中的用户编写一次插入。因此,我们存储在会话中查看的页面,并在页面加载时执行 in_array。如果页面不在数组中,则我们编写一个插入。

该表有 700,000+ 条记录,唯一的索引是主键 (id)。

插入此表的内容如下所示:

insert into page_views (user_id,page_name,created)
values ('4','Test Page','2013-08-13 10:44:21')

这个查询在我们的慢查询日志中显示为需要一段时间。我的问题是如何提高效率。我觉得这似乎是我们的数据库运行速度较慢的部分原因。


我们还有一个更新查询,它在包含大约 14,000 多条记录的 InnoDB 表上运行。当用户第一次查看特定记录并且我们设置标题为viewed='YES'的字段时,会发生更新。

update test_table set viewed='YES' where id=55

此更新也显示在慢查询日志中。该表“test_table”上有大约 (5) 个不同的索引。


#

慢查询日志的输出

计数:165(0.35%)时间:2252.210041 S总计,13.649758 s AVG,2.026723 s至313.311842 S Max(8.96%)95%的时间:1181.480258 S总数,7.573591 S AVG,7.573591 S AVG,2.026723 S SIS SAVS SAVS SAVS SAVG SAVG ):总共 12.722 毫秒,平均 77 次,最大 38 到 233 次 (0.04%) 锁定的 95%:总共 11.681 毫秒,平均 75 次,最大 38 到 84 行发送的行数:平均 0 到 0 次 (0.00%) 检查的行数: 0 avg,0 到 0 max (0.00%) 数据库:用户:XXXXX@localhost:查询的 100.00% (165),所有用户的 99.76% (46921)

查询摘要:SET timestamp=N; INSERT INTO page_views (user_id, page_name, created) VALUES ('S', 'S', 'S')1;

page_views 的表结构

id (int) 主键 page_name (varchar(255)) 创建日期时间

我有哪些选项可以加快对非常大的表的简单插入和更新?

4

1 回答 1

0

根据表中的大量行,应在这些表中定期添加/修改行。我建议先执行以下查询,然后查看您提到的查询的执行时间:

分析表 page_views;

分析表test_table;

以上命令不会花费太多时间,应该在 5/10 秒内执行。

如果您能负担得起更长的维护时间(取决于桌子的大小):

优化表 page_views;

优化表test_table;

如果您看到性能提升,我还想通知您可以配置每天执行分析并每周/每月优化的 cron 作业。

于 2014-05-12T12:09:52.010 回答