通常,SQL索引引用表的列。但是也可以在涉及表列的表达式上形成索引。

例如,请考虑下表跟踪各种“帐户”的美元金额变化

CREATE TABLE account_change( chng_id INTEGER PRIMARY KEY, acct_no INTEGER REFERENCES account, location INTEGER REFERENCES locations, amt INTEGER, -- in cents authority TEXT, comment TEXT);CREATE INDEX acctchng_magnitude ON account_change(acct_no, abs(amt));

account_change表中的每个条目都记录存款或提款到帐户。存款有正数“amt”,提款有负数的“amt”。

acctchng_magnitude索引是超过帐号(“acct_no”)和金额的绝对值。该索引允许对帐户更改的大小进行有效查询。例如,要列出帐号$ xyz的并且存款超过$ 100.00的记录,可以用下列表达式:

SELECT * FROM account_change WHERE acct_no=$xyz AND abs(amt)>=10000;

或者,要按照数量递减的顺序列出对某个特定帐户($ xyz)的所有记录,可以这样:

SELECT * FROM account_change WHERE acct_no=$xyz ORDER BY abs(amt) DESC;

如果没有acctchng_magnitude索引,上述两个示例查询都可以正常工作。acctchng_magnitude索引索引仅帮助查询更快地运行,尤其是在每个帐户的表中有许多条目的数据库上。

1.如何在表达式上使用索引

使用CREATE INDEX语句在一个或多个表达式上创建新索引,就像在列上创建索引一样。唯一的区别是表达式被列为要索引的元素而不是列名。

当索引的表达式出现在查询的WHERE子句或ORDER BY子句中时,SQLite查询计划程序将考虑在表达式上使用索引,就像在CREATE INDEX语句中编写的那样。查询规划器不执行代数。为了将WHERE子句约束和ORDER BY术语与索引匹配,SQLite要求表达式相同,除了较小的语法差异(如空白更改)。下面是创建的索引:

CREATE TABLE t2(x,y,z);CREATE INDEX t2xy ON t2(x+y);

然后运行查询:

SELECT * FROM t2 WHERE y+x=22;

上面语句是不会使用索引,因为CREATE INDEX语句(x + y)上的表达式与查询中显示的表达式(y + x)不同。这两个表达式可能在数学上是等价的,但SQLite查询规划器认为它们是相同的,而不仅仅是等价的。所以下面重写查询:

SELECT * FROM t2 WHERE x+y=22;

第二个查询可能会使用索引,因为现在WHERE子句(x + y)中的表达式与索引中的表达式完全匹配。

2.限制

对CREATE INDEX语句中出现的表达式有一些合理的限制:

  1. CREATE INDEX语句中的表达式只能引用被索引的表的列,而不能引用其他表中的列。
  2. CREATE INDEX语句中的表达式可能包含函数调用,但仅适用于其输出始终完全由其输入参数(又称: 确定性函数)确定的函数。显然,像random()这样的函数在索引中不能很好地工作。但是像sqlite_version()这样的函数虽然在任何一个数据库连接中都是常量,但在底层数据库文件的整个生命周期中都不是常量,因此不能在CREATE INDEX语句中使用。
  3. 请注意,默认情况下,应用程序定义的SQL函数被认为是非确定性的,并且可能不会在CREATE INDEX语句中使用,除非在注册函数时使用SQLITE_DETERMINISTIC标志。
  4. CREATE INDEX语句中的表达式可能不使用子查询。

表达式只能在CREATE INDEX语句中使用,而不能在 CREATE TABLE语句中的UNIQUE或PRIMARY KEY约束中使用。

3.兼容性

索引表达式的能力已添加到SQLite 版本3.9.0(2015-10-14)。早期版本的SQLite将无法使用在表达式上使用索引的数据库。

常量表达式不允许函数调用_SQLite特殊索引之表达式索引相关推荐

  1. PostgreSql 唯一索引,表达式索引,部分索引

    一.唯一索引 唯一索引字面上理解就是在索引上增加唯一约束,不允许出现索引值相同的行,目前只有Btree索引可以声明唯一索引,唯一键会自动创建唯一索引.测试表: test=# create table ...

  2. mysql9索引实战_mysql 索引实战 | 学步园

    之前有个项目,已经充分用MYSQL的调优调了,速度感觉还可以.但发现索引没用上.于是调整之. 首先,数据库中有date字段,是int类型的,入库时用php的time()入库的,现在的需求是 要求1天之 ...

  3. sql server修改索引名称_索引基本知识和索引优化

    " 索引基本知识*哈希索引*组合索引*聚簇索引与非聚簇索引*覆盖索引*索引优化*索引监控*优化案例" 索引这个东西,个人的感觉是:平时大家都不怎么重视他,感觉哪个查询慢了就对那个列 ...

  4. MySQL-索引优化篇(1)_安装演示库 [前缀索引、联合索引、覆盖索引] explain参数

    文章目录 生猛干货 官方文档 安装演示数据库sakila 索引优化策略 索引列上不能使用表达式或者函数 前缀索引和索引列的选择性 前缀索引的创建 索引列的选择性 前缀索引的优缺点 联合索引 如何选择索 ...

  5. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  6. MySQL 索引类别与索引使用指南

    文章目录 概述 MySQL 索引类型 MySQL 索引方法 BTREE 方法 HASH 方法 主键构成的索引结构 主键索引的优点 主键索引的缺点 依赖顺序插入 更新代价高 索引使用指南 索引树回顾 索 ...

  7. MySQL单列索引和组合索引的创建及区别介绍

    MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表 ...

  8. B-Tree 索引和 Hash 索引的对照

    对于 B-tree 和 hash 数据结构的理解可以有助于预測不同存储引擎下使用不同索引的查询性能的差异.尤其是那些同意你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的 ...

  9. ClickHouse MergeTree二级索引/跳数索引

    在前一篇文章<ClickHouse MergeTree表引擎和建表语句>中,我们详细介绍了MergeTree的建表语句.存储结构和索引原理,本篇我们继续介绍MergeTree的另一个特性- ...

最新文章

  1. R语言:rep函数解析
  2. TCP/IP入门(4) --应用层
  3. Stanford 研究领域
  4. Spring---基于Spring IOC的小程序
  5. vue 每次弹框都初始化
  6. 斯诺登的密码(洛谷-P1603)
  7. 9-8 更新 - 2017 Citrix partner webinar PPT及在线观看地址
  8. 在服务端合并和压缩JavaScript和CSS文件[转]
  9. JSP项目155套-开发专题-大作业设计-毕业设计【建议在校生收藏】(保持更新)
  10. linux vi指令回退,Linux命令 vi vim
  11. 一测振系统包括微型计算机,实验六 拍振实验
  12. [视频]K8软件破解脱壳入门教程
  13. 微信公众号推送天气教程,自动定时推送【Java版】开发者和小白详细教程
  14. 免费HTTP代理怎么样
  15. AVR单片机网址推荐 .
  16. mac如何在Finder中显示隐藏的文件或文件夹
  17. MySQL的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。
  18. 软件测试周刊(第62期):无论你处于什么状态,你都要明白,生活的目标是健康和快乐。
  19. 爱家Aijiacms高端大型房产门户系统V9源码+带手机端
  20. 【BZOJ5020】[THUWC 2017]在美妙的数学王国中畅游 泰勒展开+LCT

热门文章

  1. 开发者说丨如何从零开始构建一个轻量级应用
  2. 解读鸿蒙轻内核的监控器:异常钩子函数
  3. 深度解读MRS IoTDB时序数据库的整体架构设计与实现
  4. 【华为云技术分享】Scrum Master如何引导团队中的刺头
  5. 补习系列(19)-springboot JPA + PostGreSQL
  6. 【带着canvas去流浪(11)】Three.js入门学习笔记
  7. c语言如何运行txt文件,如何使用EOF在C中运行文本文件?
  8. pytorch之mnist数据集存放位置以及本地加载
  9. 关于泊松过程的参数估计
  10. latex中正文前出现一页空白页,且占正文页数