android 数据库查询中使用索引-大幅提高数据库操作速度

参考:

http://blog.csdn.net/dongyuxi1987/article/details/8239739

1.数据库索引简介
回忆一下小时候查字典的步骤,索引和字典目录的概念是一致的。字典目录可以让我们不用翻整本字典就找到我们需要的内容页数,然后翻到那一页就可以。索引也是一样,索引是对记录按照多个字段进行排序的一种展现。对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值还包括指向与它相关记录的指针。这样,就不必要查询整个数据库,自然提升了查询效率。同时,索引的数据结构是经过排序的,因而可以对其执行二分查找,那就更快了

2.索引的使用

很多对索引不熟悉的朋友在表中创建了索引,却发现没有生效,其实这大多数和我接下来讲的有关。对于where子句中出现的列要想索引生效,会有一些限制,这就和前导列有关。所谓前导列,就是在创建复合索引语句的第一列或者连续的多列。

比如通过:CREATE INDEX comp_ind ON table1(x, y, z)创建索引,那么x,xy,xyz都是前导列,而yz,y,z这样的就不是。下面讲的这些,对于其他数据库或许会有一些小的差别,这里以sqlite为标准。在where子句中,前导列必须使用等于或者in操作,最右边的列可以使用不等式,这样索引才可以完全生效。同时,where子句中的列不需要全建立了索引,但是必须保证建立索引的列之间没有间隙。

用如下语句创建索引:
CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);
这里是一个查询语句:
...WHERE a=5 AND b IN (1,2,3) AND c IS NULL AND d=‘hello‘
这显然对于abcd四列都是有效的,因为只有等于和in操作,并且是前导列。
再看一个查询语句:
... WHERE a=5 AND b IN (1,2,3) AND c>12 AND d=‘hello‘
那这里只有a,b和c的索引会是有效的,d列的索引会失效,因为它在c列的右边,而c列使用了不等式,根据使用不等式的限制,c列已经属于最右边。
最后再看一条:
... WHERE b IN (1,2,3) AND c NOT NULL AND d=‘hello‘

索引将不会被使用,因为没有使用前导列,这个查询会是一个全表查询。

创建如下表和索引:
   db.execSQL("create table if not exists t1(a,b)");        
   db.execSQL("create index if not exists ia on t1(a,b)");
插入10万条数据,分别对表进行如下操作:
select * from t1 where a=‘90012‘
插入:insert into t1(a,b) values(‘10008‘,‘name1.6982235534984673‘)
更新:update t1 set b=‘name1.999999‘ where a = ‘887‘

删除:delete from t1 where a = ‘1010‘

数据如下(5次不同的操作取平均值):
操作   无索引    有索引
查询   170ms  5ms
插入   65ms   75ms
更新   240ms  52ms
删除   234ms  78ms

可以看到显著提升了查询的速度,稍稍减慢了插入速度,还稍稍提升了更新数据和删除数据的速度。

如果把更新和删除中的where子句中的列换成b,速度就和没有索引一样了,因为索引失效。

时间: 2024-10-08 22:49:31

android 数据库查询中使用索引-大幅提高数据库操作速度的相关文章

在数据库查询中不走索引的情况与压力测试

重点关注: 1) 没有查询条件,或者查询条件没有建立索引 例如: select * from tab; 全表扫描. select * from tab where 1=1; 在业务数据库中,特别是数据量比较大的表.是没有全表扫描这种需求. 1.对用户查看是非常痛苦的. 2.对服务器来讲毁灭性的. 例如: select * from tab; SQL改写成以下语句: selec * from tab order by price limit 10 需要在price列上建立索引 select * f

关于数据库表中的索引及索引列的CRUD

-- 查询一个数据库表中的索引及索引列use [RuPengWangDB]GOSELECT  indexname = a.name , tablename = c. name , indexcolumns = d .name , a .indidFROM    sysindexes a JOIN sysindexkeys b ON a .id = b .id  AND a .indid = b.indid        JOIN sysobjects c ON b .id = c .id    

数据库查询中的特殊字符的问题

在进行数据库的查询时,会经常遇到这样的情况: 例如想在一个用户数据库中查询他的用户名和他的密码,但恰好该用户使用的名字和密码中有特殊的字符,例如单引号,"|"号,双引号或者连字符"&". 例如他的名字是1"test,密码是A|&900 这时当你执行以下的查询语句时,肯定会报错: SQL = "SELECT * FROM SecurityLevel WHERE UID="" & UserID &

华为云 DAS,大幅提高数据库开发效率

华为云数据管理服务(Data Admin Service,简称DAS),是一款专业的简化数据库管理工具,提供优质的可视化操作界面,大幅提高工作效率,让数据管理变得安全简单.主要包含以下功能:1.SQL 窗口管理DAS 提供了类似 Excel 的表格方式编辑数据,让不懂 SQL 查询语言的用户也能无障碍增删.改查表数据以及统计分析.SQL 窗口提供 SQL 格式化.SQL 智能提示.SQL执行计划.SQL模板等功能.目前,DAS 新支持常用SQL保存功能,方便开发人员查找和复用. DAS常用 SQ

MySQL数据库查询中的特殊命令

第一:   MySQL的安装 下载MySQL软件,修改安装路径之后 安装数据库MySQL5.7.18 第一步:数据库MySQL5.7.18可以在官网上下载对应的版本,下载地址:http://www.filehorse.com/download-mysql-64/, 第二步:将下载好的安装包进行解压到一个盘下面, 第三步:配置环境变量,新建环境变量MySQL_HOME,输入MySQL的安装目录, 然后再把;%MYSQL_HOME%\bin插入到Path的最后面: 第四步:以管理员的身份运行命令行,

Oracle数据库11g 中Data Guard物理备用数据库搭建与配置

Oracle Data Guard是由Oracle公司提供的一套高可用性数据库解决方案.Data Guard可以确保企业数据的高可用性,并实现数据保护和灾难恢复.Data Guard提供了一套综合创建.维护.管理和监视一个或多个备用数据库的服务,使得用户能够轻松地应对Oracle生产数据库的灾难发生和数据损坏.Data Guard将维护的备用数据库保持为和主数据库(生产数据库)的数据和事物的一致性,当主数据库意外当机或者不可用时,Data Guard可以将任何一台备用数据库切换为主数据库,从而最

数据库查寻中,这样去提高查询效率

1)数据库设计方面:         a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.         b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 c. 并不是所

android源码中,在系统多媒体数据库中增加一个字段

由于项目需求,在系统多媒体管理数据库里的存储图像文件的表中需要新增加一个字段,源码在:项目\packages\providers\MediaProvider\MediaProvider.java下,在updateDatabase()方法里,你会发现images表格是由files创建的一个视图,于是,在files的创建里增加了一个字段,如下: .... db.execSQL("CREATE TABLE files (" + "_id INTEGER PRIMARY KEY AU

2018.11.13 Hibernate 中数据库查询中的Criteria查询实例

Criteria是面向对象的无语句查询 Demo.java package com.legend.b_criteria; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Order; import org.hibernate.criterion.Pr