sqlite插入速度优化方案

标签: sqlite 速度 优化 | 发表时间:2013-03-30 21:24 | 作者:ihrthk
出处:http://blog.csdn.net

先贴上SQLiteOpenHelper的代码,我们创建测试的表是user,它有四个字段id,name,age,height,remark,测试用的小米2,默认条数为100行。


//MySQliteOpenHelper作为一个访问SQLite的帮助类,提供两方面的功能
//1.getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatatbase对象,
//对这个对象进行相关操作
//2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时进行操作
public class MySQLiteOpenHelper extends SQLiteOpenHelper {

	public static final String DATABASE_NAME = "test.db";

	public static final String TAG = "MySQLiteOpenHelper";

	public MySQLiteOpenHelper(Context context) {
		this(context, DATABASE_NAME, null, 1);
	}

	public MySQLiteOpenHelper(Context context, int version) {
		this(context, DATABASE_NAME, null, version);
	}

	// 必须要有这一个构造方法
	public MySQLiteOpenHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	// 当数据库第一次创建的时候被调用,
	// 当调用getReadableDatabase ()或getWritableDatabase 的时候
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		Log.d(TAG, "onCreate");

		String sql = "create table user(id integer primary key autoincrement,"
				+ "name varchar(20)," + "age integer," + "height long,"
				+ "remark varchar(12))";
		db.execSQL(sql);
	}

	public void close() {
		SQLiteDatabase db = this.getWritableDatabase();
		db.execSQL("drop table user");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		Log.d(TAG, "onUpgrade");
	}

}


1。使用ContentValues插入。完成时间:4805493666(纳秒)

	/**
	 * ContentValues方式
	 * 
	 * @param sum
	 * @return
	 */
	public long insert1(int sum) {
		long before = System.nanoTime();

		MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);
		// 得到数据库对象
		SQLiteDatabase db = dbHelper.getWritableDatabase();

		for (int i = 0; i < sum; i++) {
			ContentValues cv = new ContentValues();
			cv.put("name", "zhangsan");
			cv.put("age", "23");
			cv.put("height", 1.78);
			cv.put("remark", "无");
			db.insert("user", null, cv);
		}

		db.close();
		long after = System.nanoTime();
		return after - before;

	}

2。使用基本slq语句插入。完成时间:3734808485(纳秒)

public long insert2(int sum) {
		long before = System.nanoTime();

		MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);
		// 得到数据库对象
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		for (int i = 0; i < sum; i++) {
			String sql = "insert into user(name,age,height,remark) values('zhangsan',23,1.78,'无')";
			db.execSQL(sql);
		}
		db.close();

		long after = System.nanoTime();
		return after - before;
	}

3。使用SQLliteStatement插入。完成时间:4754616203(纳秒)

public long insert3(int sum) {
		long before = System.nanoTime();
		MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);
		// 得到数据库对象
		SQLiteDatabase db = dbHelper.getWritableDatabase();

		String sql = "insert into user(name,age,height,remark) values(?,?,?,?)";
		SQLiteStatement stmt = db.compileStatement(sql);
		for (int i = 0; i < sum; i++) {
			stmt.clearBindings();
			stmt.bindString(1, "zhangsan");
			stmt.bindLong(2, 23);
			stmt.bindLong(3, 178);
			stmt.bindString(4, "无");
			stmt.execute();
		}
		db.close();

		long after = System.nanoTime();
		return after - before;
	}

4。使用一次插入多条的方式。完成时间:245414315(纳秒)

public long insert4(int sum) {
		long before = System.nanoTime();

		MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);
		// 得到数据库对象
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		for (int i = 0; i < sum / 10; i++) {
			String sql = "insert into user(name,age,height,remark) values('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无'),"
					+ "('zhangsan',23,1.78,'无')";
			db.execSQL(sql);
		}
		db.close();

		long after = System.nanoTime();
		return after - before;
	}

5.使用事务处理插入方式。完成时间:229787881(纳秒)

public long insert5(int sum) {
		long before = System.nanoTime();

		MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);
		// 得到数据库对象
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.beginTransaction();
		for (int i = 0; i < sum; i++) {
			String sql = "insert into user(name,age,height,remark) values('zhangsan',23,1.78,'无')";
			db.execSQL(sql);
		}
		db.setTransactionSuccessful();
		db.endTransaction();
		db.close();

		long after = System.nanoTime();
		return after - before;
	}



作者:ihrthk 发表于2013-3-30 21:24:26 原文链接
阅读:70 评论:0 查看评论

相关 [sqlite 速度 优化] 推荐:

sqlite插入速度优化方案

- - CSDN博客移动开发推荐文章
先贴上SQLiteOpenHelper的代码,我们创建测试的表是user,它有四个字段id,name,age,height,remark,测试用的小米2,默认条数为100行. // 必须要有这一个构造方法. // 当数据库第一次创建的时候被调用,. // 当调用getReadableDatabase ()或getWritableDatabase 的时候.

Android学习笔记(六)SQLite

- - 博客园_首页
SQLite是一个极轻量型的数据库. 它在提供了和大型数据库相当的功能,还具有轻便、跨平台等优点,SQLite使用非常方便,并不需要我们像常规数据库(SQLServer,Mysql等)那样进行安装,在Android的JDK中,其实是已经包含了SQLite这个数据库的核心. 当然我们必须要强调一点,SQLite并不是只针对Android的,其实它还可以用在别的很多地方.

将Access转为SQLite数据库

- zhouding - 博客园-首页原创精华区
           SQLite是一个轻量型的数据库,各方面由于Access,对于小型网站来说,非常适合. 我今天决定将系统的数据库由Access转换为SQLite. 在网上搜索了一下,找到了DBManager这个工具,不得不说,这个软件确实好,很强大,在网上找注册码也找到半天,找不到一个.            只要将Access转换为SQLite,然后使用System.Data.SQLite.dll来访问数据库.

SQLite的原子提交原理

- way - chensheng.net
本文源自:http://www.sqlite.org/atomiccommit.html,2007/11/28的版本. 本人正在做一个项目,在项目中定义了自己的文件格式,为了做到停电或程序崩溃不损坏这些文件原有的数据,故针对操作的原子性做一些思考,后来看到sqlite的这篇文章,与自己的实现方式作了一些对比.

SQLite数据库存储引擎设计

- - searchdatabase
  SQLite是一个嵌入式库并且实现了零配置、无服务端和事务功能的SQL数据库引擎. 它在广泛领域内被使用,而且单线程读写性能与MySQL比肩,并且保证ACID性.   SQLite的存储后端是采用Btree实现,多个连接可以并发操作,但是同一时间只允许一个写着存在.   SQLite在硬盘上一个数据库一个文件,每个数据库文件头部保存有这个数据库的元信息,包括版本,大小,Btree根节点位置等等.

Android数据的四种存储方式SharePreference、SQLite、Content Provider和File (二) —— SQLite

- stony - 博客园-首页原创精华区
  SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是:.     INTEGER: 整数.   在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显示,为了能方便的操作DATE类型,SQLite提供了一组函数,详见:http://www.sqlite.org/lang_datefunc.html.

【转】优化eclipse运行速度

- - 开源软件 - ITeye博客
转载: http://www.iteye.com/topic/756538. 作者:beckrabbit. 首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse. 优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡,也就是没有full GC.

elasticsearch 优化写入速度 | easyice

- -
translog flush 间隔调整. 索引刷新间隔调整: refresh_interval. bulk 线程池和队列大小. 调整字段 Mappings. 对于 Analyzed 的字段禁用 Norms. index_options 设置. 基于版本: 2.x – 5.x. 在 es 的默认设置,是综合考虑数据可靠性,搜索实时性,写入速度等因素的,当你离开默认设置,追求极致的写入速度时,很多是以牺牲可靠性和搜索实时性为代价的.有时候,业务上对两者要求并不高,反而对写入速度要求很高,例如在我的场景中,要求每秒200w 条的平均写入速度,每条500字节左右.

Android-小项目之迷你英文词典-使用existing sqlite database-github第三库android-sqlite-asset-helper

- - CSDN博客移动开发推荐文章
将已有的词典数据库文件,用到项目中. 谷歌搜索“android existing sqlite database”. 但是,如果 数据库文件在 assets 目录下,该如何做呢. private EditText mEditText; //输入框. private TextView mReslutView; //显示查询结果.

SQLite在多线程环境下的应用

- ndv - keakon的涂鸦馆
这几天研究了一下SQLite这个嵌入式数据库在多线程环境下的应用,感觉里面的学问还挺多,于是就在此分享一下. 先说下初衷吧,实际上我经常看到有人抱怨SQLite不支持多线程. 而在iOS开发时,为了不阻塞主线程,数据库访问必须移到子线程中. 为了解决这个矛盾,很有必要对此一探究竟. 关于这个问题,最权威的解答当然是SQLite官网上的“Is SQLite threadsafe?”这个问答.