SQLite、MySQL 和 PostgreSQL 数据库速度比较(本文阐述时间很早比较,不具有最新参考性)(二十五)

 返回:SQLite—系列文章目录   

上一篇:用于 SQLite 的异步 I/O 模块(二十四)

下一篇:SQLite—系列文章目录   

注意:本文档非常非常旧。它描述了速度比较 SQLite、MySQL 和 PostgreSQL 的古老版本。

这里的数字已经变得毫无意义。此页面仅保留 作为历史文物。

摘要

进行了一系列测试来测量 SQLite 2.7.6、PostgreSQL 7.1.3 和 MySQL 3.23.41。 以下是一般情况 从这些实验中得出的结论:

  • SQLite 2.7.6 明显更快(有时高达 10 或 比默认的 PostgreSQL 7.1.3 安装快 20 倍) 在 RedHat 7.2 上执行最常见的操作。

  • SQLite 2.7.6 通常更快(有时 比 MySQL 3.23.41 快两倍以上 对于最常见的操作。

  • SQLite 执行 CREATE INDEX 或 DROP TABLE 的速度不如 其他数据库。但这并不被视为问题,因为 这些都是不常见的操作。

  • 如果将多个操作组合在一起,则 SQLite 效果最佳 单个事务。

此处显示的结果带有以下注意事项:

  • 这些测试没有试图衡量多用户性能或 优化涉及多个联接和子查询的复杂查询。

  • 这些测试位于相对较小的(大约 14 兆字节)数据库上。 它们不衡量数据库引擎对更大问题的扩展程度。

测试环境

用于这些测试的平台是具有 1GB 或内存的 1.6GHz Athlon 和 IDE 磁盘驱动器。操作系统是 RedHat Linux 7.2,带有 一个库存内核。

默认情况下,使用的 PostgreSQL 和 MySQL 服务器在 红帽 7.2。(PostgreSQL 版本 7.1.3 和 MySQL 版本 3.23.41。 没有努力调整这些引擎。特别注意 RedHat 7.2 上的默认 MySQL 配置不支持 交易。不必支持事务,MySQL 速度优势大,但SQLite仍然能够在大多数上保持自己的优势 测试。

我被告知 RedHat 7.3 中的默认 PostgreSQL 配置 不必要地保守(它被设计成 在具有 8MB RAM 的机器上工作),而 PostgreSQL 可以 通过一些知识渊博的配置,可以更快地运行 调音。 Matt Sergeant 报告说他已经调整了他的 PostgreSQL 安装 并重新运行如下所示的测试。他的结果表明, PostgreSQL 和 MySQL 的运行速度大致相同。对于 Matt's 结果,访问

过时的 URL: http://www.sergeant.org/sqlite_vs_pgsync.html

SQLite在与出现的相同配置中进行了测试 在网站上。它是使用 -O6 优化和 -DNDEBUG=1 开关,它禁用了许多“assert()”语句 在 SQLite 代码中。-DNDEBUG=1 编译器选项大约翻了一番 SQLite的速度。

所有测试均在静止的机器上进行。 使用一个简单的 Tcl 脚本来生成和运行所有测试。 可以在 SQLite 源代码树中找到此 Tcl 脚本的副本 在文件 tools/speedtest.tcl 中。

所有测试中报告的时间代表挂钟时间 在几秒钟内。为 SQLite 报告两个单独的时间值。 第一个值是 SQLite 的默认配置,其中 已打开完整磁盘同步。打开同步 on,SQLite 执行 在关键点进行 fsync() 系统调用(或等效调用) 确保关键数据具有 实际上已写入磁盘驱动器表面。同步 是保证数据库完整性所必需的,如果 操作系统崩溃或计算机意外关闭电源 在数据库更新过程中。第二次报告SQLite是 关闭同步时。关闭同步后, SQLite 有时要快得多,但存在 操作系统崩溃或意外断电可能 损坏数据库。一般来说,同步SQLite 时间用于与 PostgreSQL 进行比较(这也是 synchronous)和异步 SQLite 时间用于 与异步MySQL引擎的比较。

测试 1:1000 个插入

创建表 t1(a INTEGER, b INTEGER, c VARCHAR(100));
插入 t1 值(1,13153,'一万三千一百五十三');
插入 t1 值(2,75560,'七万五千五百六十');
......省略 995 行 插入 t1 值(998,66289,'六万六千二百八十九');

插入 t1 值(999,24322,'24,322');
插入 t1 值(1000,94142,'九万四千一百四十二');
PostgreSQL:4.373
MySQL的:0.114
SQLite 2.7.6:13.061
SQLite 2.7.6 (nosync):0.223

因为它没有中央服务器来协调访问, SQLite 必须关闭并重新打开数据库文件,从而使数据库失效 其缓存,用于每个事务。在此测试中,每个 SQL 语句 是一个单独的事务,因此必须打开和关闭数据库文件 并且缓存必须刷新 1000 次。尽管如此,异步 SQLite的版本仍然几乎与MySQL一样快。注意慢了多少 但是,同步版本是。SQLite 调用 fsync() 之后 每个同步事务,以确保所有数据都安全打开 继续之前的磁盘表面。在 13 秒的大部分时间里 同步测试时,SQLite 处于空闲状态,等待磁盘 I/O 完成。

测试 2:事务中有 25000 个 INSERT

开始;
创建表 t2(a INTEGER, b INTEGER, c VARCHAR(100));
插入 t2 值(1,59672,'五万九千六百七十二');
......省略 24997 行
INSERT INTO t2 VALUES(24999,89569,'八万九千五百六十九');
插入 t2 值 (25000,94666,'94,666');
犯;
PostgreSQL:4.900
MySQL的:2.184
SQLite 2.7.6:0.914
SQLite 2.7.6 (nosync):0.757

当所有 INSERT 都放入事务中时,SQLite 不再需要 关闭并重新打开数据库,或使其在每个语句之间的缓存失效。 它也没有 必须做任何 fsync()s 直到最后。当解开束缚时 这样,SQLite 比 PostgreSQL 和 MySQL 快得多。

测试 3:索引表中有 25000 个 INSERT

开始;
创建表 t3(a INTEGER, b INTEGER, c VARCHAR(100));
在 t3(c) 上创建索引 i3;
......省略 24998 行
插入 t3 值(24999,88509,'八万八千五百九');
插入 t3 值 (25000,84791,'八万四千七百九十一');
犯;
PostgreSQL:8.175
MySQL的:3.197
SQLite 2.7.6:1.555
SQLite 2.7.6 (nosync):1.402

有报告称 SQLite 在索引表上表现不佳。 最近添加了此测试以反驳这些谣言。的确, SQLite在创建新索引条目方面不如其他引擎快 (请参阅下面的测试 6),但它的整体速度仍然更好。

测试 4:100 个没有索引的 SELECT

开始;
SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b<1000;
从 t2 开始选择 count(*), avg(b),其中 b>=100 和 b<1100;
......省略了 96 行
SELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND b<10800;
从 t2 开始选择 count(*),avg(b),其中 b>=9900 和 b<10900;
犯;
PostgreSQL:3.629
MySQL的:2.760
SQLite 2.7.6:2.494
SQLite 2.7.6 (nosync):2.526

此测试对没有索引的 25000 个条目表执行 100 次查询, 因此需要全表扫描。以前版本的 SQLite 用于 在此测试中比 PostgreSQL 和 MySQL 慢,但最近的表现 增强功能提高了它的速度,因此它现在是最快的 的组。

测试 5:字符串比较中的 100 个 SELECT

开始;
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%';
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%';
......96 行省略
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%99%';
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%';
犯;
PostgreSQL:13.409
MySQL的:4.640
SQLite 2.7.6:3.362
SQLite 2.7.6 (nosync):3.372

此测试仍执行 100 次全表扫描,但它使用 使用字符串比较而不是数值比较。 SQLite的速度是PostgreSQL的三倍以上,大约是PostgreSQL的30% 比MySQL更快。

测试 6:创建索引

在 t2(a) 上创建索引 i2a;
在 t2(b) 上创建索引 i2b;
PostgreSQL:0.381
MySQL的:0.318
SQLite 2.7.6:0.777
SQLite 2.7.6 (nosync):0.659

SQLite 在创建新索引方面速度较慢。这不是一个大问题 (因为新索引并不经常创建)但它是 正在处理中。希望SQLite的未来版本会做得更好 这里。

测试 7:5000 个带有索引的 SELECT

SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b<100;
从 t2 开始选择 count(*),avg(b),其中 b>=100 和 b<200;
SELECT count(*), avg(b) FROM t2 WHERE b>=200 AND b<300;
......4994 行省略了
SELECT count(*), avg(b) FROM t2 WHERE b>=499700 AND b<499800;
SELECT count(*), avg(b) FROM t2 WHERE b>=499800 AND b<499900;
从 t2 开始选择 count(*), avg(b),其中 b>=499900 和 b<500000;
PostgreSQL:4.614
MySQL的:1.270
SQLite 2.7.6:1.121
SQLite 2.7.6 (nosync):1.162

当这三个数据库引擎都有要使用的索引时,它们的运行速度都更快。 但SQLite仍然是最快的。

测试 8:1000 个没有索引的更新

开始;
更新 t1 设置 b=b*2,其中 a>=0 和 a<10;
更新 t1 设置 b=b*2,其中 a>=10 和 a<20;
......省略 996 行 UPDATE t1 SET b=b*2 WHERE a>=9980 AND a<9990;

更新 t1 设置 b=b*2,其中 a>=9990 和 a<10000;
犯;
PostgreSQL:1.739
MySQL的:8.410
SQLite 2.7.6:0.637
SQLite 2.7.6 (nosync):0.638

对于这个特定的UPDATE测试,MySQL始终如一 五次或十次 比 PostgreSQL 和 SQLite 慢。我不知道为什么。MySQL是 通常是一个非常快的引擎。也许这个问题已经解决了 在更高版本的 MySQL 中。

测试 9:25000 个带有索引的更新

开始;
更新 t2 设置 b=468026 其中 a=1;
更新 t2 设置 b=121928 其中 a=2;
......省略 24996 行 UPDATE t2 SET b=35065 WHERE a=24999;

更新 t2 设置 b=347393 其中 a=25000;
犯;
PostgreSQL:18.797
MySQL的:8.134
SQLite 2.7.6:3.520
SQLite 2.7.6 (nosync):3.104

在最近的 2.7.0 版本中,SQLite 的运行速度与 MySQL 在此测试中。但是最近对SQLite的优化还有更多 更新速度提高了一倍以上。

测试 10:25000 个带有索引的文本 UPDATE

开始;
更新 t2 SET c='148,382' WHERE a=1;
更新 t2 SET c='366,502' WHERE a=2;
......省略 24996 行 UPDATE t2 SET c='383,999' WHERE a=24999;

更新 t2 SET c='256,830' WHERE a=25000;
犯;
PostgreSQL:48.133
MySQL的:6.982
SQLite 2.7.6:2.408
SQLite 2.7.6 (nosync):1.725

同样,SQLite 的 2.7.0 版曾经以大致相同的速度运行 作为 MySQL。但是现在 2.7.6 版本比 MySQL 快两倍多,并且 比 PostgreSQL 快 20 倍以上。

公平地说,PostgreSQL开始在这个测试中失败。一个 知识渊博的管理员也许能够让 PostgreSQL 运行很多 通过稍微调整和调整服务器来加快速度。

测试 11:从 SELECT 插入

开始;
插入 t1 从 t2 中选择 b,a,c;
插入 t2 从 t1 中选择 b,a,c;
犯;
PostgreSQL:61.364
MySQL的:1.537
SQLite 2.7.6:2.787
SQLite 2.7.6 (nosync):1.599

在此测试中,异步 SQLite 仅比 MySQL 慢一点。 (MySQL似乎特别擅长INSERT...SELECT 语句。 PostgreSQL 引擎仍在跳动 - 它使用的 61 秒的大部分时间 在等待磁盘 I/O 上花费了时间。

测试 12:不带索引的 DELETE

从 t2 中删除,其中 c 像 '%fifty%';
PostgreSQL:1.509
MySQL的:0.975
SQLite 2.7.6:4.004
SQLite 2.7.6 (nosync):0.560

SQLite 的同步版本是本次测试中组中最慢的, 但异步版本是最快的。 区别在于执行 fsync() 所需的额外时间。

测试 13:使用索引执行 DELETE 操作

从 t2 中删除,其中 A>10 和 A<20000;
PostgreSQL:1.316
MySQL的:2.262
SQLite 2.7.6:2.068
SQLite 2.7.6 (nosync):0.752

这个测试很重要,因为它是为数不多的 PostgreSQL 比 MySQL 快。异步 SQLite 是, 但是,比其他两个都快。

测试 14:大 DELETE 之后的大 INSERT

插入 t2 选择 * 从 t1;
PostgreSQL:13.168
MySQL的:1.815
SQLite 2.7.6:3.210
SQLite 2.7.6 (nosync):1.485

一些旧版本的 SQLite(版本 2.4.0 之前) 在 DELETE 的序列,后跟新的 INSERT。如此测试所示, 问题现已解决。

测试 15:一个大的 DELETE,后跟许多小的 INSERT

开始;
从 t1 中删除;
插入 t1 值(1,10719,'10,719');
......省略 11997 行
插入 t1 值(11999,72836,'七万二千八百三十六');
插入 t1 值(12000,64231,'六万四千二百三十一');
犯;
PostgreSQL:4.556
MySQL的:1.704
SQLite 2.7.6:0.618
SQLite 2.7.6 (nosync):0.406

SQLite 非常擅长在事务中执行 INSERT,这可能 解释了为什么它在这个测试中比其他数据库快得多。

测试 16:删除表

删除表 t1;
下降表 t2;
下降表 t3;
PostgreSQL:0.135
MySQL的:0.015
SQLite 2.7.6:0.939
SQLite 2.7.6 (nosync):0.254

在删除表方面,SQLite比其他数据库慢。 这可能是因为当 SQLite 删除一个表时,它必须经过 擦除数据库文件中处理该表的记录。MySQL 和 另一方面,PostgreSQL 使用单独的文件来表示每个表 因此,他们只需删除文件即可删除表,速度要快得多。

另一方面,删除表并不是一个非常常见的操作 因此,如果SQLite需要更长的时间,那不被视为一个大问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习一门语言的方法和套路(B站转述)

视频链接 up虽然长相英(ping)俊(ping)&#xff0c;但是讲的干活&#xff0c;没恰饭。 学习流程&#xff1a; 1.快速阅读&#xff0c;掌握概况 2.深入细节内容 例如&#xff1a;java (JDBC)、html 、netty 不管三七二十一&#xff0c;先了解套路&#xff0c;再深入研究。 高…

安装CUDNN详细过程

cuDNN&#xff08;CUDA Deep Neural Network library&#xff09;是由NVIDIA开发的深度学习GPU加速库。 cuDNN包含了许多针对神经网络操作进行高度优化的函数&#xff0c;旨在使深度学习框架能够在NVIDIA的GPU上实现最佳性能&#xff0c;这个库提供了高效计算和加速&#xff0c…

牛客网刷题 :BC50 你是天才吗

描述 据说智商140以上者称为天才&#xff0c;KiKi想知道他自己是不是天才&#xff0c;请帮他编程判断。输入一个整数表示一个人的智商&#xff0c;如果大于等于140&#xff0c;则表明他是一个天才&#xff0c;输出“Genius”。 输入描述&#xff1a; 多组输入&#xff0c;每…

在 PyCharm 中使用系统安装的 Python 和 Anaconda 的 Python什么区别

virtualenv environment &#xff1a; virtualenv 是一个用于创建独立 Python 环境的工具。它可以在同一个系统上创建多个相互独立的 Python 环境&#xff0c;每个环境都有自己的 Python 解释器和包库&#xff0c;从而可以实现不同项目之间的依赖隔离和版本控制。coda environm…

vue快速入门(二十五)本地存储与初始化使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 本地获取数据数据存储到本地 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

2024蓝桥杯——宝石问题

先展示题目 声明 以下代码仅是我的个人看法&#xff0c;在自己考试过程中的优化版&#xff0c;本人考试就踩了很多坑&#xff0c;我会—一列举出来。代码可能很多&#xff0c;但是总体时间复杂度不高只有0(N) 函数里面的动态数组我没有写开辟判断和free&#xff0c;这里我忽略…

频率域滤波基础(离散傅里叶变换使用填充的缺陷)

本来是个很简单的问题&#xff0c;作者硬是写的这么复杂&#xff0c;翻译还搞错了。重点是我发现作者真正有用的东西没讲到&#xff0c;比如相位和谱如何影响图像。连个转换公式都没有&#xff0c;我只能说作者是在混字数。 首先看关于中心对称是什么意思&#xff1f;我木太明白…

MySql 视图 存储过程 触发器

文章目录 视图数据库对象视图的理解创建、查看、更新、删除 存储过程和存储函数概述分类存储过程的创建和调用存储函数的创建和调用存储过程和存储函数的对比存储过程和存储函数的查看、修改、删除 变量GLOBAL 与 SESSION 变量的使用会话用户变量和局部变量的使用 定义条件与处…

【机器学习300问】70、向量化技术来计算神经网络时维度如何确保正确?

一、向量化技术在进行神经网络计算时的优势 向量化是一种优化技术&#xff0c;通过使用数组操作代替for循环&#xff0c;可以大大提高代码的性能和效率。在深度学习中尤其明显&#xff0c;可以提高计算效率、简化代码、优化内存使用。 二、如何确保计算时维度是正确的&#xf…

中标了,Trojan/Hijack.v木马病毒怎么解决?

火绒只是提示有病毒木马&#xff0c;并未解决。 经过不断尝试.。。。。。。 往下拉找到 Internet选项 连接 – 局域网设置 把前面的勾选取消 发现以上办法网络上出现的搜索注册表关键字等办法都无法解决。。。 解决方法一&#xff1a; 电脑进入安全模式&#xff0c;然后进…

【vue】v-model 双向数据绑定

:value&#xff1a;单向数据绑定v-model&#xff1a;双向数据绑定 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

STM32 MPU配置参数

TXE LEVEL一般只用MPU_TEX_LEVEL0 1 - 1 - 1 -0性能最强&#xff08;TEX - C - B- S&#xff09;. #define MPU_TEX_LEVEL0 ((uint8_t)0x00) #define MPU_TEX_LEVEL1 ((uint8_t)0x01) #define MPU_TEX_LEVEL2 ((uint8_t)0x02) 基于上表进行常用配置 &#xff…

Wpf 使用 Prism 实战开发Day19

待办事项功能页面完善以及优化 概要&#xff1a; 由于待办事项功能页&#xff0c;数据已正常渲染出来了。但页面新增&#xff0c;查询&#xff0c;修改&#xff0c;删除等功能还未实现。本章节来实现页面的请求后台实现CURD&#xff08;增删改查&#xff09; 一.待办事项查询…

泰迪智能科技携手韩山师范学院“企业微专业合作办学招生宣讲”圆满结束

为进一步深化校企合作&#xff0c;落实高校应用型人才培养。2024年4月11日&#xff0c;泰迪智能科技携手韩山师范学院开展企业微专业合作办学招生宣讲会在韩山师范学院顺利举行&#xff0c;本次宣讲会旨在与韩山师范学院学子深入讲解数字经济时代下的企业用工需求&#xff0c;着…

ins视频批量下载,instagram批量爬取视频信息

简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…

数据结构 -- 二分查找

本文主要梳理了二分查找算法的几种实现思路&#xff0c;基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客 1、基本概念 &#xff08;1&#xff09;前提条件&#xff1a;待查找数据必须…

解决调用相同url数据不刷新问题

原代码 原因 谷歌浏览访问相同接口默认调用缓存数据 解决方案 添加时间戳

WebKit简介及工作流程

文章目录 一、WebKit简介二、WebKit结构三、Webkit工作流程四、WebKit常见问题五、WebKit优点六、相关链接 一、WebKit简介 WebKit是一个开源的浏览器引擎&#xff0c;它的起源可以追溯到2001年&#xff0c;当时苹果公司推出了其首款基于Unix的操作系统Mac OS X。在2002年&…

科大讯飞星火开源大模型iFlytekSpark-13B GPU版部署方法

星火大模型的主页&#xff1a;iFlytekSpark-13B: 讯飞星火开源-13B&#xff08;iFlytekSpark-13B&#xff09;拥有130亿参数&#xff0c;新一代认知大模型&#xff0c;一经发布&#xff0c;众多科研院所和高校便期待科大讯飞能够开源。 为了让大家使用的更加方便&#xff0c;科…

Golang | Leetcode Golang题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; func findSubstring(s string, words []string) (ans []int) {ls, m, n : len(s), len(words), len(words[0])for i : 0; i < n && im*n < ls; i {differ : map[string]int{}for j : 0; j < m; j {differ[s[ij*n:i(j1)*n]…