设为首页 加入收藏

TOP

SQLite 优化笔记(二)
2012-02-01 13:19:45 】 浏览:4900
Tags:SQLite 优化 笔记

完整结果如下,未注明的单位都是秒,越暗的格子越快:

page size (bytes)10242048409681921638432768
file size (bytes)6,518,057,9848,241,479,6808,241,385,4728,231,018,4966,586,433,5366,584,467,456
synchronousFULLOFFFULLOFFFULLOFFFULLOFFFULLOFFFULLOFF
HDDINSERT
INTO
a6.125.656.125.586.005.525.875.445.755.405.755.46
b48.2541.1757.0244.0462.0442.4655.0041.2345.5330.6245.7431.13
c48.1539.7256.3644.2056.5446.7755.6645.7144.7936.6346.7636.72
SELECT
COUNT
(*)
before
VACUUM
a10.230.210.220.190.550.480.260.210.210.170.200.19
b171.1496.80126.71150.36139.94161.6351.6471.4339.6159.2540.7161.68
c113.3015.0136.6635.3913.7315.347.947.593.433.301.240.97
a20.040.030.230.160.550.550.340.350.200.170.220.17
b20.440.44127.56129.53140.05139.9781.4783.5145.7745.3340.6040.31
c20.060.0536.4836.4913.8115.696.166.042.993.130.890.67
after
VACUUM
a10.230.210.210.190.550.500.330.320.210.220.210.20
b171.3680.18127.12130.90139.91140.1682.0185.3745.3548.8640.6641.78
c10.030.030.170.200.480.450.330.210.180.020.180.01
a20.030.030.210.180.540.550.280.280.200.220.210.19
b20.440.44128.20130.51140.32139.9281.3382.6145.2845.0240.8839.88
c20.030.030.200.190.480.450.310.310.180.200.170.18
VACUUM1413.671079.271549.421280.281354.261193.45948.60876.00792.43654.82682.16648.19
SSDINSERT
INTO
a5.805.645.725.555.675.505.615.445.485.345.505.40
b46.0533.7356.6143.6857.3345.0355.7342.3445.3334.0846.6733.79
c46.1935.7655.4646.3952.5144.8651.0443.7441.8932.5641.3132.99
SELECT
COUNT
(*)
before
VACUUM
a10.070.070.070.070.220.210.060.060.070.060.060.06
b117.8228.5350.7462.6360.2872.5517.9329.5714.4125.8214.0124.77
c10.840.870.990.960.500.500.370.500.110.300.050.05
a20.040.030.070.070.220.210.130.130.100.100.080.08
b20.490.4950.7550.7060.1860.7538.3839.4422.6323.5318.5520.09
c20.060.060.990.980.190.500.280.270.100.130.040.03
after
VACUUM
a10.070.070.070.070.220.210.140.130.100.100.090.08
b117.4818.9650.6151.1260.1862.6439.3542.1723.8826.8518.4922.16
c10.030.030.060.030.190.020.120.010.090.010.070.00
a20.030.030.070.070.210.210.130.130.100.100.080.08
b20.490.4950.6451.1260.2860.5338.4338.5022.6422.8220.2118.87
c20.040.030.060.060.200.190.120.120.090.000.080.01
VACUUM594.84610.94714.03716.23530.24610.41436.40439.43330.01344.00337.77338.67

跑完了之后发现这个程序并不好,比如:插入的数据过于整齐,VACUUM 对性能几乎没有影响,而文件大小倒是大起大落;程序运行中间由于没有停顿,上一步操作的写入没完成就开始了下一步,由于 SQLite 的写入是异步的,这可能会影响计时。不过由于我不想再跑一遍了,

姑且就以这个结果来说明吧。

首先 c 表很有意思,插入的效率和 b 表相当,但检索的效率有时甚至比 a 表还要快,这个与其说是数据库的改进方向还不如说是 SQLite 的 bug 。另外注意程序中没有用自带的 sqlite3 模块而是用了重新编译的 pysqlite2 ,这是因为 Python 2.6.5 final win32 amd64 的 sqlite3 是 2.5.9 版本,这个版本上 c 表在各种情况下都比 b 表慢。而 3.6.4 版本中引入了独特的 INDEXED BY 语句,我本想试试指定一个独立存放的索引能不能提升性能,结果 SQLite 已经优化了索引的选择。

即便是在这个 6G 的数据库中,page_size = 1024 性能也相当理想,也是唯一能缓存数据以备第二次检索的。将 page_size 设为 32768 对检索的改进都微乎其微(插入和 VACUUM 倒是不小)。至于 2048 和 4096 会导致文件大小增加了五分之一,速度也就狠狠地慢下来了。看来一般情况下 page_size 使用默认设置对于数据库性能和系统占用都是比较理想的,如果是数 G 以上的数据库倒是可以提高 page_size 。

在检索和 VACUUM 时 SSD 的速度大约是 HDD 的三倍,而 INSERT 几乎没有区别。由于 SSD 有写入寿命的限制,对于这种不怎么更新的数据库,似乎插入完成后再存到 SSD 比较好。

关掉 synchronous 对于插入也有三倍左右的提升,网上有人说 SSD 上 nosync 插入有 150 倍的速度提升,可是我没碰到。另外检索和 VACUUM 反而下降了是怎么回事?想不通……话说回来官网的测试也有不少 nosync 反而更快的结果

总之 SQLite 的参数要根据实际情况来选择,而实际情况很复杂,可能还是要多测试——得到这样一个说了等于没说的结论。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SQlite索引 下一篇sqlite插入数据sql语句

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目