【问题标题】:Using database vs file for static data将数据库与文件用于静态数据
【发布时间】:2018-04-17 06:39:29
【问题描述】:

我的网站右侧栏中有一个名为“每周最高用户”的框。所以,一个星期,那个盒子的内容不会改变。所以我可以通过两种方式存储这些数据:

  1. 使用表数据库(并通过事件每周更新)
  2. 使用文件并通过 cron 作业每周更新它

现在我想知道,哪个更好,成本更低?我的意思是执行select 查询更优化,或者使用file_get_contents()explode() 在服务器上打开一个文本文件?

【问题讨论】:

  • 在这些情况下,与往常一样,值得对其进行测试并测量这两个过程需要多长时间。然后你就会知道,对于你自己的系统。我希望文件比数据库快得多,即使数据库将所有数据都缓冲在内存中。但这是一个疯狂的猜测,不能确定。
  • 我很确定,这两种方法对您来说都足够快。我会选择更简单的。

标签: php mysql sql performance file


【解决方案1】:

这取决于很多不同的因素,仅举几例

  • 有多少用户是本周的顶级用户? 5、10、100?
  • 数据库当前产生多少负载?您是只查询用户还是同时处理登录/日志解析/...?
  • 您使用的是哪个数据库引擎?
  • 您使用的是 SSD 还是 HDD(仅对大文件很重要)
  • 您使用的是哪个操作系统? (内存中的一些缓存文件)
  • 您是否使用持久性 mysql 会话?

我总是尝试将此类数据存储在数据库中并为其添加时间戳,以便能够同时显示过去的数据或从中创建统计数据;这样我也可以简单地存储用户 ID,而无需从数据库中单独加载数据(例如 SELECT user.name FROM user, user_of_week WHERE user.id = user_of_week.user AND user_of_week.weekid = 120 ORDER BY user_of_week.position ASC;

您可以尝试自己针对您的特定情况进行测试 - 编写测试脚本并在测量时间的同时加载 100 次:

header('Content-Type: text/plain;charset=utf-8');
// Connect to database here
$TestAmount = 100;
$OverallTime = 0;
for($i = 0; $i < $TestAmount; $i++) {
    // Read current time
    $start = microtime(true);

    // Load data from database here

    // Get the amount of time it took
    $time = microtime(true) - $start;
    echo $i .': took '. $time ."\n";
    $OverallTime += $time;
}
echo 'Overall time: '. $OverallTime ."\n";
echo 'Average: '. ($OverallTime / $TestAmount);
// Close connection to database here

这将输出类似这样的内容:

0: took 4
1: took 5
Overall time: 450
Average: 4.5

对文件重复相同的操作并进行比较。

在文件中存储数据时,您还可以使用 JSON 之类的东西 - 这更容易解析。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2013-01-04
    • 2017-12-13
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多