ホームページ  >  記事  >  バックエンド開発  >  PHPでのファイルの読み書きとデータベースの読み書きの効率の比較分析

PHPでのファイルの読み書きとデータベースの読み書きの効率の比較分析

WBOY
WBOYオリジナル
2016-07-25 08:57:34961ブラウズ
  1. set_time_limit(0);
  2. function fnGet($filename)
  3. {
  4. $content = file_get_contents($filename);
  5. return $content;
  6. }
  7. function fnGetContent($filename)
  8. {
  9. $content = fnGet($filename);
  10. return $content;
  11. }
  12. $times=100000;
  13. echo '数据库查询结果:
    ';
  14. //---------- ------------------------
  15. $begin=fnGetMicroTime();
  16. for($i=0;$i {
  17. $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
  18. $row=$dbcon->mydb_fetch_row($res);
  19. $content=$row[0] ;
  20. }
  21. echo 'fetch_row '.$times.' 次の時間:'.(fnGetMicroTime()-$begin).'
    ';
  22. //----------- ------------------------
  23. $begin=fnGetMicroTime();
  24. for($i=0;$i{
  25. $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
  26. $row=$dbcon->mydb_fetch_array($res);
  27. $content=$row['log_Content'] ;
  28. }
  29. echo 'fetch_array '.$times.' 次の時間:'.(fnGetMicroTime()-$begin).'
    ';
  30. //----------- ------------------------
  31. $begin=fnGetMicroTime();
  32. for($i=0;$i{
  33. $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
  34. $row=$dbcon->mydb_fetch_object($res);
  35. $content=$row->log_Content;
  36. }
  37. echo 'fetch_object '.$times.' 次の時間:'.(fnGetMicroTime()-$begin).'
    ';
  38. //----------- ------------------------
  39. $dbcon->mydb_free_results();
  40. $dbcon->mydb_disconnect();
  41. fnWriteCache('test.txt' ,$content);
  42. echo '直接读文件测试结結果:
    ';
  43. //------------------------- --------
  44. $begin=fnGetMicroTime();
  45. for($i=0;$i<$times;$i++)
  46. {
  47. $content = fnGetContent('test.txt');
  48. }
  49. echo 'file_get_contents 直接读'.$times.'次回時間:'.(fnGetMicroTime()-$begin).'
    ';
  50. / /---------------------------------
  51. $begin=fnGetMicroTime();
  52. for($i=0; $i{
  53. $fname = 'test.txt';
  54. if(file_exists($fname))
  55. {
  56. $fp=fopen($fname,"r");//flock( $fp,LOCK_EX);
  57. $file_data=fread($fp, filesize($fname));//rewind($fp);
  58. fclose($fp);
  59. }
  60. $content = fnGetContent('test.txt' );
  61. }
  62. echo 'fopen直接读'.$times.'次回時間:'.(fnGetMicroTime()-$begin).'
    ';
复制代

4K サイズのデータ​​のクエリ結果: fetch_row 100000回時間:16.737720012665秒 fetch_array 100000 回時間: 16.661195993423 秒 fetch_object 100000 回時間: 16.775065898895 秒

ファイルのテスト結果を直接読み取る: file_get_contents 直接読み取り 100000 回 時間: 5.4631857872009 秒 fopen は 100000 回直接読み取り: 11.463611125946 秒

プラスチック ID のクエリ結果: fetch_row 100000 回時間: 12.812072038651 秒 fetch_array 100000 回時間: 12.667390108109 秒 fetch_object 100000 回時間: 12.988099098206 秒

ファイルのテスト結果を直接読み取る: file_get_contents 直接読み取り 100000 回 時間: 5.6616430282593 秒 fopen直接読み取り時間10万回:11.542816877365秒

テストの結論: 1. ファイルを直接読み取る方が、データベース クエリより効率的です。接続時間と切断時間は記事に含まれていません。

2. 一度に読み取られるコンテンツが大きいほど、ファイルを直接読み取ることの利点はより明らかです (ファイルの読み取りにかかる時間はわずかに増加しますが、これはファイル ストレージの継続性とクラスター サイズに関係します)。この結果はまさに Tianyuan と同じです。逆に、MYSQL には大きなファイルを読み取るための追加の操作がある可能性があることを示しています (単純な代入変換だけであれば、時間は 30% 近く増加しています)。

3. ファイルの書き込みや INSERT 時にテストを行わないと、データベースの効率は悪化するだけであると推測できます。

4. 小さな構成ファイルがデータベース機能を使用する必要がない場合は、別のデータテーブルやレコードを作成する必要がなく、そのような大きなファイルを保存する方が便利です。ファイル内の画像や音楽として、パスやサムネイルなどのインデックス情報のみをデータベースに入れる方が合理的です。

5. PHP でファイルを読み込むだけであれば、fopen や fclose よりも file_get_contents の方が効率的で、この関数の存在を判断する時間を除けば約 3 秒かかります。

6. fetch_row と fetch_object は fetch_array から変換する必要があります。私は PHP のソース コードを見ていませんが、これはインターネットで言われていることに反しているようです。 プログラムの効率が主要なプロセスの効率と同等であり、キャッシュなどの手段が含まれていないと仮定すると、MSYQL プロセスに関係なく、どの種類のデータの読み書きもファイルを直接操作するほど高速ではありません。最終的にはディスクからコピーされます (レコード ストアも同等です)。もちろん、これらすべての前提条件は、コンテンツが読み取り専用であり、並べ替えや検索操作とは何の関係もありません。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。