>백엔드 개발 >PHP 튜토리얼 >PHP에서 파일을 읽고 쓰는 것과 데이터베이스를 읽고 쓰는 효율성 비교 분석

PHP에서 파일을 읽고 쓰는 것과 데이터베이스를 읽고 쓰는 효율성 비교 분석

WBOY
WBOY원래의
2016-07-25 08:57:34979검색
  1. set_time_limit(0);
  2. function fnGet($filename)
  3. {
  4. $content = file_get_contents($filename );
  5. $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<$times;$i )
  17. {
  18. $res =$dbcon->mydb_query("log_ID='1'인 블로그에서 log_Content 선택");
  19. $row=$dbcon->mydb_fetch_row($res);
  20. $content=$row[0] ;
  21. }
  22. echo 'fetch_row '.$times.' 다음:'.(fnGetMicroTime()-$begin).'
    ';
  23. //--------- -----------
  24. $begin=fnGetMicroTime();
  25. for($i=0;$i<$times; $i )
  26. {
  27. $res=$dbcon->mydb_query("SELECT log_Content FROM 블로그 WHERE log_ID='1'");
  28. $row=$dbcon->mydb_fetch_array($res) ;
  29. $content=$row['log_Content'];
  30. }
  31. echo 'fetch_array '.$times.' 다음:'.(fnGetMicroTime()-$begin).'
    ';
  32. //--------- -----------
  33. $begin=fnGetMicroTime();
  34. for($i=0;$i<$times; $i )
  35. {
  36. $res=$dbcon->mydb_query("SELECT log_Content FROM 블로그 WHERE log_ID='1'");
  37. $row=$dbcon->mydb_fetch_object($res) ;
  38. $content=$row->log_Content;
  39. }
  40. echo 'fetch_object '.$times.' 다음:'.(fnGetMicroTime()-$begin).'
    ';
  41. //--------- -----------
  42. $dbcon->mydb_free_results();
  43. $dbcon->mydb_disconnect();
  44. fnWriteCache('test.txt',$content);
  45. echo '直接读文件测试结果:
    ';
  46. //------------- -------
  47. $begin=fnGetMicroTime();
  48. for($i=0;$i<$times;$i )
  49. {
  50. $content = fnGetContent('test.txt');
  51. }
  52. echo 'file_get_contents直接读'.$times.'次时间:'.(fnGetMicroTime ()-$begin).'
    ';
  53. //----------------------- ----------
  54. $begin=fnGetMicroTime();
  55. for($i=0;$i<$times;$i )
  56. {
  57. $fname = ' test.txt';
  58. if(file_exists($fname))
  59. {
  60. $fp=fopen($fname,"r");//flock($fp,LOCK_EX);
  61. $ file_data=fread($fp, filesize($fname));//rewind($fp);
  62. fclose($fp);
  63. }
  64. $content = fnGetContent('test.txt');
  65. }
  66. 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 직접 읽기 시간: 100000회: 11.542816877365초

테스트 결론: 1. 데이터베이스 쿼리보다 파일을 직접 읽는 것이 더 효율적이며 연결 및 연결 끊김 시간은 기사에 포함되지 않습니다.

2. 한 번에 읽는 내용이 클수록 파일을 직접 읽는 장점이 더욱 분명해집니다. (파일 읽기 시간이 약간 늘어나는데, 이는 파일 저장의 연속성 및 클러스터 크기와 관련이 있습니다.) 이는 예상했던 것과 정반대이며, 이는 MYSQL이 더 큰 파일을 읽기 위한 추가 작업을 수행할 수 있음을 나타냅니다(단순한 할당 변환인 경우 시간이 거의 30% 증가했습니다). 작은.

3. 파일 작성 및 INSERT 시 테스트를 하지 않으면 데이터베이스 효율성이 더 나빠질 수밖에 없다고 유추할 수 있습니다.

4. 작은 구성 파일은 데이터베이스 기능을 사용할 필요가 없다면 별도의 파일로 저장하는 것이 더 적합합니다. 사진, 음악 등의 대용량 파일은 따로 만들 필요가 없습니다. , 등은 파일 저장에 더 적합합니다. 편의상 경로나 썸네일과 같은 인덱스 정보만 데이터베이스에 넣는 것이 더 합리적입니다.

5. PHP에서 파일만 읽는 경우, 이 함수의 존재 여부를 확인하는 데 필요한 시간을 제외하면 file_get_contents가 fopen 및 fclose보다 효율적입니다. 이는 약 3초 더 짧습니다.

6. fetch_row와 fetch_object는 fetch_array에서 변환해야 합니다. PHP의 소스 코드를 본 적이 없습니다. 실행만 보면 fetch_array가 더 효율적이라는 것을 알 수 있습니다. 인터넷. 프로그램 효율성이 핵심 프로세스와 동일하고 캐싱 및 기타 조치가 포함되지 않는다고 가정하면 모든 유형의 데이터를 읽고 쓰는 것은 MSYQL 프로세스에 관계없이 파일을 직접 읽는 것만큼 빠르지 않습니다. (레코드 저장 영역과 동일) 따라서 이 모든 것의 전제는 콘텐츠가 읽기 전용이고 정렬 또는 검색 작업과 관련이 없다는 것입니다.



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.