【问题标题】:Too long loading page - analytics system加载页面太长 - 分析系统
【发布时间】:2014-07-07 07:28:25
【问题描述】:

我想就我自己的分析系统向您征求意见。 到目前为止,我的系统会收集所有点击并将它们保存在 SQL 数据库中。

分析的第一部分。

SQL 数据库logs 如下所示:

+----+----------------------+-------------+---------------------------------------------+----------------+--------------+----------+
| id | time                 | address     | address_to                                  | ip             | resolution   | id_guest |
|----+----------------------+-------------+---------------------------------------------+----------------+--------------+----------|
| 1  | 2013-12-03#14:31:35  | index.php   | https://www.youtube.com/watch?v=6VJBBUqr1wM | 89.XX.XXX.6    | 1366x768     | 6        |
| 2  | 2013-12-03#14:48:21  | file.php    | https://www.youtube.com/watch?v=0EWbonj7f18 | 89.XX.XXX.6    | 1366x768     | 6        |
| 3  | 2013-12-03#16:16:55  | contact.php | https://www.youtube.com/watch?v=_o-XIryB2gg | 178.XX.XXX.140 | 1920x1080    | 11       |
| 4  | 2013-12-03#16:21:32  | index.php   | https://www.youtube.com/watch?v=z0M96LyTyX4 | 178.XX.XXX.140 | 1920x1080    | 11       |
| 5  | 2013-12-03#16:44:32  | movies.php  | https://www.youtube.com/watch?v=cUhPA5qIxDQ | 178.XX.XXX.140 | 1920x1080    | 11       |
+----+----------------------+-------------+---------------------------------------------+----------------+--------------+----------+

每次点击都会作为新记录添加到数据库中。

我网站上的所有电影都在 SQL 数据库的第二张表上(movies):

+----+----------------------+-------------+---------------------+
| id | name                 | address     | tags                |
|----+----------------------+-------------+---------------------|
| 1  | 2013-12-03#14:31:35  | 6VJBBUqr1wM | bass,electro,trance |
| 2  | 2013-12-03#14:48:21  | 0EWbonj7f18 | electro,house,new   |
| 3  | 2013-12-03#16:16:55  | _o-XIryB2gg | electro,party,set   |
| 4  | 2013-12-03#16:21:32  | z0M96LyTyX4 | trance,house,new    |
| 5  | 2013-12-03#16:44:32  | cUhPA5qIxDQ | techno,new,set      |
+----+----------------------+-------------+---------------------+

一切都完美无缺。在数据库中我有用户观看的所有电影,我想精确定义,所以记下IP +分辨率。

第一个问题: 这是确定用户的好方法吗?

--

分析的第二部分。

现在我想使用收集的日志和显示界面与基于浏览材料的电影。 我从数据库中为进入网站的用户选择所有日志。 从日志中我选择标识符 film 并在表components 中扫描它以获取日志并放入数组中。例如,ID = 6 的用户将有一个数组:

array(
    [0] = > bass,
    [1] = > electro,
    [2] = > trance,
    [3] = > electro,
    [4] = > house,
    [5] = > new
);

现在我将按照最常出现的顺序对数组的内容进行排序:

array(
    [2] = > electro,
    [1] = > bass,
    [1] = > trance,
    [1] = > house,
    [1] = > new
);

根据数组的内容可以显示用户可能感兴趣的视频。

一切都很完美,但我现在才发现的问题...... 在logs 表中,我有超过 450 万条记录。可以想象,搜索这么多的记录需要花费大量的时间,进入网站有时长达10秒...

我希望我蹩脚的英语还算清楚。

请提供任何关于如何解决加载页面问题的建议。

【问题讨论】:

  • 你在使用索引吗?你到底在寻找什么?它必须是 100% 准确的最新数据吗?您可以做一些工作来分析数据并在某个搜索表中准备结果,大约每小时一次。
  • 您可以考虑做很多事情:高性能服务器、高性能数据库引擎、查询优化、数据库优化、缓存等
  • @Uriel_SVK 我从来没有对索引造成伤害...谢谢,它很有帮助,听起来像是我解决问题的方法:) 从components 我选择所有日志,其中 id = USER_ID。你想 CRON 吗?
  • @PatrykSzram 是的,你可以使用 cron。另外,您将日志中的数据用于什么目的?例如,如果您需要用户首选的分辨率,您可以为所有用户创建一个首选分辨率的搜索表,然后您可以通过该 cron 作业填写它
  • 请编辑您的问题并显示您真正使用的查询。

标签: php jquery mysql sql database


【解决方案1】:
  1. 在需要的地方使用索引,很难准确地知道在哪里 - 你没有显示任何查询 - 基本上你希望在查询的 WHERE 部分和 JOINS 中都有索引列。您不必索引大部分时间保持不变的列 - isloggedin、isadmin、语言等

  2. 为您需要搜索的数据创建搜索表 - 例如,如果您需要知道首选分辨率或用户访问网站的次数,您可以创建一个 cron 作业来为所有用户解析此数据并存储它在搜索表中。如果需要,这也可用于进行一些统计。对于这些标签,您可以有一个带有 user_idtagcount 的表格

  3. 如果您只需要最后访问的站点、最后的分辨率,...只需为此创建一个表格,您可以在其中为每个用户存储和更新一行

【讨论】:

  • 我的投票:投 2 票(不是 1 票)。实际日志文件中的索引通常不是一个好主意,因为您在这些表中进行了大量的写作。
  • @user247245 如果他要使用INSERT DELAYED dev.mysql.com/doc/refman/5.1/en/insert-delayed.html 应该对站点延迟没有影响如果查询表应该被索引
猜你喜欢
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多