一例关于如何提升SQLite的性能

今天接到一个Ticket,说SQLite数据库的访问太慢。用VisualVM一查,两个访问函数需要分别消耗~200秒和~300秒。真不太能接受,想想如何解决吧。

问题分析

SQLite数据量大约有40K,其实数据量并不大,主要问题一定还出在SQLite的表结构上。在这个应用中,我们需要根据现有数据和用户的输入,在线计算很多新的列,还要支持排序,过滤等操作。为了避免磁盘IO,定义了很多的View,没有生成新的Table。虽然没有在SQLite的网上查到具体说明,但问题一定就出在这些View的定义上。恰好是因为没有生成Table,View的每次生成计算反而需要更多时间。

问题解决

那如何能生成Table,并避免大量读写操作呢?想到SQLite支持In-memory DB, 所以应该可以把这一切的操作放到内存里。这里的Java示例代码说明如何使用In-memory DB.

具体思路:

  • 新建In-memory database
  • 把目标数据库restore到database中(前提是我们的数据量不大,并且生成后不会有变化)
  • 不用View,全部使用Table,用户输入变化时,就重新写Table。

结果

当我看到改进之后的函数访问时间在VisualVM上变成0.0ms时,我知道这个Ticket可以Resolve了。^_^

References

读《程序员的数学》

程序员的数学
程序员的数学

这是本小书,把很多深奥的数学原理结合到了很多小故事中,读起来很轻快,适合在工作忙碌的间隙阅读。

数学是很多程序员常挂在嘴边的东西,并总觉得没有学好,有东西不会,需要提高。这是好事,是某种“越了解越无知”的表现。这时读读书,总能觉得学到了些东西,或者以前学到的知识被加强了。

到底什么是程序员的数学呢,作者主要有总结如下:

  • 简单规则(2进制)
  • 逻辑
  • 有“余数”来分组
  • 数学归纳法
  • 排列组合,递归

其实很多基本方法和思想也都能在日常工作中体现,比如从简单做起,尝试小数,抽象扩展。