`
cloudtech
  • 浏览: 4622909 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

在SQLite中使用索引优化查询速度(转)

 
阅读更多
在SQLite中使用索引优化查询速度
作者:tamsyn 来源:www.sqlite.com.cn 时间:2006-12-11
<script type="text/JavaScript"> var yahoo_pid=&quot;un_52773_769_19&quot;; var yahoo_bordercolor=&quot;FFFFFF&quot;; var yahoo_titlecolor=&quot;0080c0&quot;; var yahoo_descolor=&quot;000000&quot;; var yahoo_linkcolor=&quot;006600&quot;; var yahoo_titlebgcolor=&quot;FFFFFF&quot;; var yahoo_desbgcolor=&quot;FFFFFF&quot;; var yahoo_width=550; var yahoo_height=80; var yahoo_isbanner=1; var yahoo_displink=1; var yahoo_adsnum=3; var yahoo_simple=0; var yahoo_iniframe=1; </script><script src="http://cm.p4p.cn.yahoo.com/inf.js" type="text/javascript"></script>
在进行多个表联合查询的时候,使用索引可以显著的提高速度,刚才用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》
分享到:
评论

相关推荐

    System.Data.SQLite 数据库详细介绍

    SQLite介绍在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义、表、索引和数据本身)都保存在一个单一的文件中。并且,SQLite是一...

    ios-iOS swift版 sqlite3 详解.zip

    完整的sqlite3封装,包括对data数据类型的存储,版本的升级,以及事务的添加,索引的添加,还有,优化查询速度,增加数据库列属性等等。值得学习以及在项目中使用。github地址是:...

    史上最强全面解析SQLite

    测试3:在编入索引表格中的25000 INSERTs ........................................... 26 测试4:没有索引的 100 SELECTs..................................................... 26 测试5:在一个字符串比较上的100 ...

    DB2DB 数据库转换工具 V1.9.5

    并针对云端数据库中使用最多的 MySQL 数据库进行优化,使得从原数据库复制到新的数据库时保留更多的数据表属性设置。大大减少程序员、DBA、实施人员将大型数据库进行迁移时的等待、测试和调试时间,减少公司为了测试...

    asp.net知识库

    在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库...

    易语言程序免安装版下载

    “在库中的对应命令名”请务必准确填写静态库中公开导出的符号名称(C函数(cdecl)编译后,符号名称通常是在函数名称前加下划线(_));“在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall...

    精通ANDROID 3(中文版)1/2

    23.5.1 在Android搜索中使用操作键  23.5.2 使用应用程序特定的搜索上下文  23.6 资源  23.7 对平板电脑的意义  23.8 小结  第24章 文本到语音转换  24.1 Android中的文本到语音转换  24.2 使用语段...

    精通Android 3 (中文版)2/2

    23.5.1 在Android搜索中使用操作键  23.5.2 使用应用程序特定的搜索上下文  23.6 资源  23.7 对平板电脑的意义  23.8 小结  第24章 文本到语音转换  24.1 Android中的文本到语音转换  24.2 使用语段...

    Collector资料收集管理器

    2、使用SQLite数据库(RTB)进行实时备份数据库,数据库(HDF)打开始加载。 2、全新界面,可改变布局和改变皮肤; 3、查询状态下可修改数据; 4、EXE电子书文件可自定义图标。 更新日期 2009-03-24 21:00:00 更新...

    精易模块[永久免费] V3.12

    ' 修复 - 文本_取中间_批量 () 有的取不出来的问题,优化取出速度。 ' 修复 - 系统_取本机IP () 取本机IP失败的问题 ' 修复 - 内存.读整数 () 修复改长整时程序会异常退出的问题,去掉第三个参数,增加 读短整数 ()读...

Global site tag (gtag.js) - Google Analytics