据说 数据库文件最大支持 281 T

每个数据库由一个或多个数据页组成,一个数据库内的所有数据页大小都相同,但是不同的数据库可以使用不同的数据页大小,范围从 512 到 65536 字节。

从 sqlite 3.33.0 开始,一个数据库文件最多使用 4294967294 个数据页(由 max_page_count 编译指令决定),意味着最大支持约 2.8e+14 字节(281 TB)

20亿行实践sqlite性能测试记录:

硬盘: 旧机械硬盘

表结构: 共4个字段

CREATE TABLE 测试 ( 
    id   INTEGER PRIMARY KEY AUTOINCREMENT,
    字段a CHAR    UNIQUE,
    字段b   CHAR,
    字段c INT 
);

第一次 插入了2亿数据 没有计时 

第二次 再次插入2亿条数据时  耗时 40多分钟  平均每秒插入8万条左右

第三次 再次插入4亿数据  耗时 4737.079秒  平均每秒也是8.4万条左右,此时文件大小 53.1 GB  表内总行数 8.1亿 行

第四次 再次插入6亿数据   耗时:6400.066秒 平均每秒9.3万条  此时文件大小93.7 GB   表内行数14.1亿行

第五次 再插入6亿数据 耗时:6499.033秒  平均每秒9.3万条 此时文件大小 134 GB  表内行数20.1亿

(可能是第四次因为刚好硬盘要满了 换了块硬盘的原因 插入竟然越来越快了。虽然换了块硬盘,但是也是十年前的老机械硬盘)

image.png

image.png

按id查 和 order by id 都正常

执行 select * from 性能测试 where 字段a='xxxx'  耗时70-140毫秒左右, 查询前1亿行的数据 和 8亿行以后的数据 差距不是很大

执行 select * from 性能测试 where 字段b='xxxx'  直接卡死 无法查询

执行 select * from [性能测试] limit 10000000,5000  耗时2000毫秒

执行 select * from [性能测试] limit 20000000,5000  耗时4000毫秒

执行 select * from [性能测试] where id>200000000 limit 0,100 耗时 250毫秒

执行 select * from [性能测试] where id in (1400000000,1300000000,1200000000) 耗时15毫秒

执行 select * from [性能测试] where id>2000000000 and id<2000005000 耗时78毫秒  (说明分批维护是没问题的)


此时 再 执行给字段b增加索引的语句 也是直接卡死  等了半天没反应~~

多线程读取测试 内部sql语句:select * from 性能测试 where 字段a='xxxx'

读取测试,单线程查询 

image.png

10个线程

image.png

100个线程:

image.png

实验证明  虽然多线程  读取数据没有乱  但是速度却慢下来了    说明即使多线程读取  它内部应该也是一个线程一个线程读取的