数据库读写与文件读写速度对比

1.项目搭建

1.写一个sql文件,创建10000条数据,放到数据库
2.写一个脚本文件,将数据库指定表中的数据写入一个txt文本文件
3.项目中加入postgresql-42.7.4.jar文件,这样才能在项目中远程请求数据库
4.本项目为了测试,创建了三个测试的情形:
4.1查找标题中带有 “XXX” 字样的电影,分别使用数据库和文本文件,对比其速度
4.2将人名中所有的 “To” 改为 “TTOO”,分别使用数据库和文本文件,对比其速度
4.3查找演员名称为指定字符串的数据,分别使用数据库和文本文件,对比其速度
==这里需要注意:4.1、4.2均是无法使用数据库索引的,4.3可以使用数据库索引,使用索引的情况下数据库查询会更快==

读者不需要自己创建,项目代码在School/database/project1 at main · gupengzu/School这里读者可以自行下载。

2.查找标题中带有 “XXX” 字样的电影

我们编译并运行select文件夹下的两个文件展示数据库查找速度和文件查找速度。

PS H:\Study\school\database_files\project1\select> java -cp ".;..\postgresql-42.7.4.jar" DatabaseSelect
=== PostgreSQL数据库查询性能测试 ===
连接信息: jdbc:postgresql://localhost:5432/postgres
查询表: project1.movies
===================================================
关键词: The        | 找到: 2517  部电影
  连接时间:   266.46 ms
  查询时间:    14.10 ms
  总耗时:     280.56 ms
  前5个结果:
    1. The Shawshank Redemption (1994) - Frank Darabont
    2. The Godfather (1972) - Francis Ford Coppola
    3. The Dark Knight (2008) - Christopher Nolan
    4. The Matrix (1999) - Lana Wachowski,Lilly Wachowski
    5. The Silence of the Lambs (1991) - Jonathan Demme

关键词: Love       | 找到: 929   部电影
  连接时间:   176.96 ms
  查询时间:     3.54 ms
  总耗时:     180.50 ms
  前5个结果:
    22. Your Mystery of Love (1973) - Chris Smith
    23. Their Voyage of Love (1980) - Jessica Johnson
    24. My Saga of Love (1966) - William Anderson
    25. My Saga of Courage with Love (2014) - Michael Rodriguez
    26. Her Saga of Love (2016) - Michael Johnson

关键词: War        | 找到: 770   部电影
  连接时间:    60.20 ms
  查询时间:     2.72 ms
  总耗时:      62.92 ms
  前5个结果:
    21. Her Dream of War (1956) - John Davis
    22. Your Voyage of War (1969) - John Johnson
    23. Our Saga of War (2013) - James Anderson
    24. A Quest of War (1978) - William Miller
    25. A Voyage of War (2019) - Jessica Wilson

关键词: Dream      | 找到: 1385  部电影
  连接时间:    59.88 ms
  查询时间:     3.45 ms
  总耗时:      63.33 ms
  前5个结果:
    21. Her Dream of War (1956) - John Davis
    22. My Voyage of Dreams (2015) - Michael Johnson
    23. A Crusade of Dreams (1950) - Mary Davis
    24. A Dream of Dreams (1998) - Susan Wilson
    25. My Mystery of Dreams (1972) - Emily Brown

关键词: Journey    | 找到: 679   部电影
  连接时间:    57.71 ms
  查询时间:     3.05 ms
  总耗时:      60.76 ms
  前5个结果:
    29. My Journey of Courage (1972) - Mary Rodriguez
    30. Your Journey of Glory (1968) - Michael Thomas
    31. A Journey of the Past (2013) - Lisa Davis
    32. Your Journey of Honor (2002) - John Miller
    33. A Journey of Hope (1987) - John Jones


=== 多次测试平均性能 ===
对关键词 'The' 执行 5 次查询...
  第1次 - 连接: 172.99 ms | 查询:   2.46 ms | 总计: 175.45 ms
  第2次 - 连接:  58.20 ms | 查询:   1.65 ms | 总计:  59.85 ms
  第3次 - 连接:  59.44 ms | 查询:   1.84 ms | 总计:  61.28 ms
  第4次 - 连接: 170.51 ms | 查询:   1.71 ms | 总计: 172.21 ms
  第5次 - 连接:  57.91 ms | 查询:   1.95 ms | 总计:  59.86 ms
────────────────────────────────────────────────────────────
平均连接时间:   103.81 ms
平均查询时间:     1.92 ms
平均总时间:     105.73 ms
结果数量:         2517 条
PS H:\Study\school\database_files\project1\select> java FileSelect
=== 文件查询性能测试 ===
数据文件: ../data_pipe.txt
===================================================
关键词: The        | 找到: 3646  部电影 | 执行时间: 33.55      ms
  前5个结果:
    1. The Shawshank Redemption (1994) - Frank Darabont
    2. The Godfather (1972) - Francis Ford Coppola
    3. The Dark Knight (2008) - Christopher Nolan
    4. The Matrix (1999) - Lana Wachowski,Lilly Wachowski
    5. The Silence of the Lambs (1991) - Jonathan Demme

关键词: Love       | 找到: 929   部电影 | 执行时间: 20.39      ms
  前5个结果:
    22. Your Mystery of Love (1973) - Chris Smith
    23. Their Voyage of Love (1980) - Jessica Johnson
    24. My Saga of Love (1966) - William Anderson
    25. My Saga of Courage with Love (2014) - Michael Rodriguez
    26. Her Saga of Love (2016) - Michael Johnson

关键词: War        | 找到: 770   部电影 | 执行时间: 12.01      ms
  前5个结果:
    21. Her Dream of War (1956) - John Davis
    22. Your Voyage of War (1969) - John Johnson
    23. Our Saga of War (2013) - James Anderson
    24. A Quest of War (1978) - William Miller
    25. A Voyage of War (2019) - Jessica Wilson

关键词: Dream      | 找到: 1385  部电影 | 执行时间: 5.61       ms
  前5个结果:
    21. Her Dream of War (1956) - John Davis
    22. My Voyage of Dreams (2015) - Michael Johnson
    23. A Crusade of Dreams (1950) - Mary Davis
    24. A Dream of Dreams (1998) - Susan Wilson
    25. My Mystery of Dreams (1972) - Emily Brown

关键词: Journey    | 找到: 679   部电影 | 执行时间: 5.23       ms
  前5个结果:
    29. My Journey of Courage (1972) - Mary Rodriguez
    30. Your Journey of Glory (1968) - Michael Thomas
    31. A Journey of the Past (2013) - Lisa Davis
    32. Your Journey of Honor (2002) - John Miller
    33. A Journey of Hope (1987) - John Jones


=== 多次测试平均性能 ===
对关键词 'The' 执行 5 次查询...
  第1次: 4.63 ms
  第2次: 5.65 ms
  第3次: 5.96 ms
  第4次: 4.19 ms
  第5次: 4.37 ms
平均执行时间: 4.96 ms | 结果数量: 3646

可以看到数据库的纯查询性能实际上比文件查询快约2.6倍

3.将人名中所有的 “To” 改为 “TTOO”

我们编译并运行update文件夹下的两个文件展示数据库查找速度和文件查找速度。

PS H:\Study\school\database_files> java -cp ".;project1/postgresql-42.7.4.jar" project1.update.DatabaseUpdate
=== PostgreSQL数据库更新性能测试 ===
连接信息: jdbc:postgresql://localhost:5432/postgres
更新操作: 将actors字段中的'To'替换为'TTOO'
===================================================
包含 'To' 的记录数: 2082
  示例记录:
    ID:830 - Their Story of Love - 演员: Tom Damon,Julia Clooney,Matt Jolie
    ID:1801 - Our Mission of Hope - 演员: Tom Hanks,Brad Pitt,Leonardo Depp
    ID:3490 - My Saga of Destiny - 演员: Matt Streep,Tom Damon,Anne Damon
    ID:3622 - A Adventure of the Past - 演员: Tom Pitt,Meryl Clooney,Denzel Pitt
    ID:3624 - His Secret of War - 演员: Tom Hanks,Hugh Clooney,Brad Streep
? 数据库更新完成!
   影响行数: 2082
   操作耗时(不含连接): 63.59 ms
   总耗时(含连接): 342.25 ms
包含 'TTOO' 的记录数: 2082
  示例记录:
    ID:178 - The Story of the Future - 演员: Meryl Roberts,TTOOm Crowe,Matt Washington
    ID:182 - Her Secret of the Past - 演员: Matt Depp,Hugh Johansson,TTOOm Depp
    ID:184 - My Mystery of War - 演员: Anne Hathaway,TTOOm Jackman,Scarlett Washington
    ID:195 - My Secret of Destiny - 演员: TTOOm Martinez,Brad Crowe,Scarlett Hanks,Hugh Roberts
    ID:199 - Our Voyage of Glory - 演员: Johnny Clooney,Scarlett Hanks,TTOOm Johansson

=== 恢复数据 ===
? 数据恢复完成!
   恢复行数: 2082
   操作耗时(不含连接): 62.17 ms
   总耗时(含连接): 216.81 ms
包含 'To' 的记录数: 2082
  示例记录:
    ID:830 - Their Story of Love - 演员: Tom Damon,Julia Clooney,Matt Jolie
    ID:1566 - Her Secret of Hope - 演员: Leonardo Jackman,Tom Streep,Tom Jolie
    ID:1801 - Our Mission of Hope - 演员: Tom Hanks,Brad Pitt,Leonardo Depp
    ID:3490 - My Saga of Destiny - 演员: Matt Streep,Tom Damon,Anne Damon
    ID:3590 - My Quest of Love - 演员: Leonardo Kidman,Tom Pitt,Meryl Roberts
PS H:\Study\school\database_files> java -cp ".;project1" project1.update.FileUpdate
=== 文件更新性能测试 ===
数据文件: project1/data_pipe.txt
更新操作: 将actors字段中的'To'替换为'TTOO'
===================================================
? 备份文件已创建: project1/data_pipe_backup.txt
包含 'To' 的记录数: 5
  示例记录:
    ID:5 - Forrest Gump - 演员: Tom Hanks,Robin Wright,Gary Sinise
    ID:31 - Our Voyage of Destiny - 演员: Tom Roberts,Johnny Hathaway,Meryl Jolie
    ID:32 - The Odyssey of Peace - 演员: Tom Clooney,Denzel Depp,George Hanks
    ID:33 - Their Voyage of Love - 演员: Anne DiCaprio,Hugh Streep,Tom Hanks
    ID:38 - My Mission of Glory - 演员: Nicole Pitt,Leonardo DiCaprio,Tom Jackman
? 文件更新完成!
   更新行数: 2082
   执行时间: 132.60 ms
包含 'TTOO' 的记录数: 5
  示例记录:
    ID:5 - Forrest Gump - 演员: TTOOm Hanks,Robin Wright,Gary Sinise
    ID:31 - Our Voyage of Destiny - 演员: TTOOm Roberts,Johnny Hathaway,Meryl Jolie
    ID:32 - The Odyssey of Peace - 演员: TTOOm Clooney,Denzel Depp,George Hanks
    ID:33 - Their Voyage of Love - 演员: Anne DiCaprio,Hugh Streep,TTOOm Hanks
    ID:38 - My Mission of Glory - 演员: Nicole Pitt,Leonardo DiCaprio,TTOOm Jackman

=== 恢复数据 ===
? 数据恢复完成!
   执行时间: 7.94 ms
包含 'To' 的记录数: 5
  示例记录:
    ID:5 - Forrest Gump - 演员: Tom Hanks,Robin Wright,Gary Sinise
    ID:31 - Our Voyage of Destiny - 演员: Tom Roberts,Johnny Hathaway,Meryl Jolie
    ID:32 - The Odyssey of Peace - 演员: Tom Clooney,Denzel Depp,George Hanks
    ID:33 - Their Voyage of Love - 演员: Anne DiCaprio,Hugh Streep,Tom Hanks
    ID:38 - My Mission of Glory - 演员: Nicole Pitt,Leonardo DiCaprio,Tom Jackman

可以看到更新操作数据库比文件快约1倍

4.查找演员名称为指定字符串的数据

我们编译并运行index文件夹下的两个文件展示数据库查找速度和文件查找速度。

PS H:\Study\school\database_files> java -cp ".;project1;project1/postgresql-42.7.4.jar" project1.index.DatabaseIndexSelect
=== 使用索引的数据库查询性能测试(等值查询) ===
查询演员: Matt Johansson,Tom Hathaway,Brad Pitt
============================================================
  示例记录:
    ID:6585 - Her Dream of Freedom - 演员: Matt Johansson,Tom Hathaway,Brad Pitt

包含 'Matt Johansson,Tom Hathaway,Brad Pitt' 的电影数: 1
操作耗时(不含连接): 29.06 ms
总耗时(含连接): 336.17 ms
PS H:\Study\school\database_files> java -cp ".;project1" project1.index.FileIndexSelect         
=== 文件查询性能测试(无索引,等值查询) ===
查询演员: Matt Johansson,Tom Hathaway,Brad Pitt
============================================================
  示例记录:
    ID:6585 - Her Dream of Freedom - 演员: Matt Johansson,Tom Hathaway,Brad Pitt

包含 'Matt Johansson,Tom Hathaway,Brad Pitt' 的电影数: 1
总耗时: 69.73 ms

可以看到在有索引的情况下速度差距还会更大,现在数据库查询的速度大概是文件查询速度的三倍。实际上由于数据库的索引常常为B+树,如果数据量进一步增大,使用索引的查询速度与文件查询速度差距会越来越大。但是本人电脑性能有限,就不展示数据量到达10万、100万的情况了,读者感兴趣可以自行实验。

5.总结

通过对 PostgreSQL 数据库与本地文件的性能测试可知:在标题关键词查找、人名内容更新操作中,数据库分别比文件快约 2.6 倍、1 倍;借助索引进行演员名称等值查询时,数据库速度达文件的 3 倍。可见,数据库依托索引机制等优化,在数据操作核心环节优势显著,且数据量越大,其与文件的性能差距会越明显,更适合结构化数据的管理与大规模数据操作,而文件仅在少量简单非结构化文本匹配场景中便捷性略有优势。

6.补充

读者如果细心的话可以看到上面的查找数据库不只有查找数据的时间,还有连接数据所需要的时间,而且连接数据库的时间比较长,几百毫秒。可能会有人有疑问:使用数据库存储数据,读取数据时需要连接,算上连接的时间,不就比本地文件存储数据的读取速度要慢了吗?
在实际开发中数据库只需要连接一次,连接后就放入连接池了,不用再次连接,所以这个几百毫秒的时间消耗在很长时间内只需要执行一次,并不是每次读取数据库数据都需要重新连接!。所以用户不用担心由于连接时间导致数据库读取速度比文件读取速度慢。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注