使用数据库vs文件获取静态数据

时间:2018-04-17 06:39:29

标签: php mysql sql performance file

我的网站右栏中有一个名为"每周最高用户"的框。因此,一周内,该框的内容不会改变。所以我可以用两种方式存储这些数据:

  1. 使用表数据库(并按事件每周更新)
  2. 使用文件并使用cron作业每周更新一次
  3. 现在我想知道哪一个更好,成本更低?我的意思是执行select查询更为理想,或者使用file_get_contents()explode()在服务器上打开文本文件吗?

1 个答案:

答案 0 :(得分:1)

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

  • 本周的顶级用户有多少用户? 5,10,100?
  • 数据库目前产生多少负载?你只查询用户,还是用它来处理登录/日志解析/ ...?
  • 您使用的是哪个数据库引擎?
  • 您使用的是固态硬盘还是硬盘驱动器(仅适用于大型文件)
  • 您使用的是哪个操作系统? (内存中的一些缓存文件)
  • 您是否使用持久性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的东西 - 这样更容易解析。