在进行多个表联合查询的时候,使用索引可以显著的提高速度,刚才用SQLite做了一下测试。
建立三个表:
create table t1
(id integer primary key,
num integer not null,
word1 text not null,
word2 text not null);
create table t2
(id integer primary key,
num integer not null,
word1 text not null,
word2 text not null);
create table t3
(id integer primary key,
num integer not null,
word1 text not null,
word2 text not null);
建立若干索引:
t1表:在num,word1,word2上有复合索引
t2表:在num,word1,word2上各有一个索引
t3表:在word1上有一个索引
create index idxT1 on t1(num,word1,word2);
create index idxT2Num on t2(num);
create index idxT2Word1 on t2(word1);
create index idxT2Word2 on t2(word2);
create index idxT3Word1 on t2(word1);
向三个表中各插入10000行数据,其中num项为随机数字,word1和word2中是英文单词,三个表中对应的num,word1和word2列中都包含有部分相同值,但是它们在表中出现的顺序不同。
速度测试结果:
1) select count(*) from t1,t3 where t1.word2=t3.word2;
很慢(t3.word2上没有索引)
2) select count(*) from t3,t1 where t1.word2=t3.word2;
很慢(t1.word2上没有独立索引)
3) select count(*) from t1,t2 where t1.word2=t2.word2;
很快(t2.word2上有索引)
4) select count(*) from t2,t1 where t1.word2=t2.word2;
很慢(t1.word2上没有独立索引)
5) select count(*) from t1,t2 where t1.num=t2.num;
很快(t2.num上有索引)
6) select count(*) from t2,t1 where t1.num=t2.num;
很快(t1的复合索引中,第一个列是num)
7) select count(*) from t1,t3 where t1.num=t3.num;
很慢(t3.num上没有索引)
8) select count(*) from t3,t1 where t1.num=t3.num;
很快(t1的复合索引中,第一个列是num)
结
论:在from子句后面的两个表中,如果第2个表中要查询的列里面带有索引,这个查询的速度就快,反之就慢。比如第三个查询,from后面的第2个表是
t2,t2在word2上有索引,所以这个查询就快,当输入SQL命令并回车后,查询结果就立即显示出来了,但是如果使用第4个查询命令(即把t1和t2
的位置互换),查询起来却用了1分零6秒。
可见索引的建立对于提高数据库查询的速度是非常重要的。
更多关于SQLite查询优化的知识可以参考《Chris Newman》写的《SQLite》一书的第四章:《Query Optimization》
相关推荐
SQLite介绍在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义、表、索引和数据本身)都保存在一个单一的文件中。并且,SQLite是一...
完整的sqlite3封装,包括对data数据类型的存储,版本的升级,以及事务的添加,索引的添加,还有,优化查询速度,增加数据库列属性等等。值得学习以及在项目中使用。github地址是:...
测试3:在编入索引表格中的25000 INSERTs ........................................... 26 测试4:没有索引的 100 SELECTs..................................................... 26 测试5:在一个字符串比较上的100 ...
并针对云端数据库中使用最多的 MySQL 数据库进行优化,使得从原数据库复制到新的数据库时保留更多的数据表属性设置。大大减少程序员、DBA、实施人员将大型数据库进行迁移时的等待、测试和调试时间,减少公司为了测试...
在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库...
“在库中的对应命令名”请务必准确填写静态库中公开导出的符号名称(C函数(cdecl)编译后,符号名称通常是在函数名称前加下划线(_));“在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall...
23.5.1 在Android搜索中使用操作键 23.5.2 使用应用程序特定的搜索上下文 23.6 资源 23.7 对平板电脑的意义 23.8 小结 第24章 文本到语音转换 24.1 Android中的文本到语音转换 24.2 使用语段...
23.5.1 在Android搜索中使用操作键 23.5.2 使用应用程序特定的搜索上下文 23.6 资源 23.7 对平板电脑的意义 23.8 小结 第24章 文本到语音转换 24.1 Android中的文本到语音转换 24.2 使用语段...
2、使用SQLite数据库(RTB)进行实时备份数据库,数据库(HDF)打开始加载。 2、全新界面,可改变布局和改变皮肤; 3、查询状态下可修改数据; 4、EXE电子书文件可自定义图标。 更新日期 2009-03-24 21:00:00 更新...
' 修复 - 文本_取中间_批量 () 有的取不出来的问题,优化取出速度。 ' 修复 - 系统_取本机IP () 取本机IP失败的问题 ' 修复 - 内存.读整数 () 修复改长整时程序会异常退出的问题,去掉第三个参数,增加 读短整数 ()读...