在大型数据中一张表中要容纳几万、几十万、甚至上百万的数据,而当这些表与其他表连接后,所得到的新的数据数目更是大大超过原来的表。当用户检索这么大量的数据时,经常会感觉到慢。这个时候要提高数据库的检索性能,就必须要用到索引。给表追加合适的索引能极大的改善检索的效率,提高数据库性能。

什么是索引

在认识索引之前,我们先了解一下对于没有索引的表示如何进行检索的。例如:

SELECT * FROM employee WHERE name=’wang’;

在默认的状态下,表中的记录是没有顺序的。也就是说,符合条件的数据保存在表中的什么位置,我们并不知道。这时候,数据库首先会从第一条记录开始检索。

但是,检索进行的过程中,找到了一个叫wang的人,并不意味着找到了所有叫wang的人。因为在数据库中叫wang的人可能只有一个,也可能有两个以上。因此,结果是要将表中的搜有记录都比较一遍。这个通常称为全表扫描。

为了解决这个问题,引入了索引的概念。索引顾名思义就是表中所有记录的搜索引导。类似于一本书的目录。

书籍的命令是按照一定的顺序来组织的。数据库中索引也是相同的做法。针对上面的表employee来,如果给name加了索引。名字索引就是在数据库中保存了姓名与包含此姓名的记录位置信息的集合(set)。这样,不用对整个表进行扫描就可以立即检索出结果。

索引的内部构造

实际运行中如果以表格的形式来管理索引,肯定不是一个有效率的方法。如果以表格的形式来保存索引,数据库的检索对象只是从一般的表变成保存索引的表,矛盾还是没有讲解。这里在大多数数据库中用了一种称为B树(Balanced Tree,平衡树)的结构来保存索引。

B树

枝叶扩散开来的树状结构。各个节点中保留着复合关键字以及指针组成的数组。指针当然是确定数据位置的信息,节点就是由这些指针相互关联起来。

在B树中,一个显著的特征是从根节点到各个叶子节点的距离都相等。这样,检索任何值时都经过相同数目的节点,能提高检索效率。

索引的设置与分析

创建索引时使用CREATE INDEX命令,CREATE INDEX命令语法如下:

CREATE [UNIQUE] INDEX 索引名 ON 表名(列名,….);  #CREATE 不能建立主键索引

ALTER TABLE table_name add INDEX[UNIQUE] index_name(colnum)

删除索引

DROP INDEX 索引名 ON 表名

创建多列构成的复合索引及唯一性索引

索引可以含有多个列。例如,使用以下SQL语句创建列lname、fname的索引。

CREATE INDEX in_name ON employee(lname,fname);

这样的索引被称为复合索引。

分析索引优劣

使用EXPLAIN/DESC命令来确认 索引的使用情况

如果遍历的次数与创建索引索引前的变化不大,则说明创建索引时选择的列名不合理,需要选择合适的列重建索引。这正是分析索引优劣的方法。

索引的优点

极大地加快了查询,减少扫描和锁定的数据行数

索引的缺点

占用磁盘空间,减慢了数据更新速度。

添加索引有如下原则

1、为经常需要排序和联合操作的字段建立索引

2、为常作为查询条件的字段建立索引

3、不要给大字段类型(text等)加索引

索引失效的场合总结

为表追加了索引后,并不能保证在每次检索时都会使用列索引。如果SQL检索语句编写不当,就会出现无法使用索引的情况。此处归纳一些无法使用索引的情况,以帮助用户创建更合适的索引以及编写更有效率的SELECT检索语句。

1、 进行后方一致/部分一致检索的场合

下列的SQL检索语句是不能使用索引的。

a) SELECT * FROM employee WHERE name LIKE “%w%”;

b) SELECT * FROM employee WHERE name LIKE “%w”;

2、 使用了IS NOT NULL、[<>]比较运算符的场合

使用了IS NOT NULL、[<>]比较运算符的场合也是不能使用索引的。例如,下面的检索语句就不能使用索引。

SELECT * FROM employee WHERE name IS NOT NULL;

SELECT * FROM employee WHERE name <>’wang’;

3、 对列使用了运算/函数的场合

对索引使用了函数或进行了某些运算的情况,也是不能使用索引的。下面的检索语句检索了所有出生在1980年的员工,由于使用了YEAR函数,所以就不能使用索引了。

SELECT * FROM employee WHERE YEAR(birth) = ‘1980’;

4、 复合索引的第一列没有包含在WHERE条件语句中的场合

例如,针对表employee我们创建了以下复合索引。

CREATE INDEX in_index ON employee(lname,fname);

针对这个索引,如果我们单独检索lname列,或者同时检索lname与fname列时,该索引是会被使用到的。即执行以下检索语句将使用到此索引。

SELECT * FROM employee WHERE lname= ‘wang’ AND fname=’xiao’;

SELECT * FROM employee WHERE lname=’wang’;

而下面的检索语句则不能使用此索引。

SELECT * FROM employee WHERE fname=’xiao’;

SELECT * FROM employee WHERE lname=’wang’ OR lname=’xiao’;

前一条语句中索引的第一列没有包含在检索条件中,后一条检索语句看起来好像是包含了所有的索引列,但由于使用了OR关键字,检索条件的后面半句还是要对fname列进行单独检索。

转载于:https://www.cnblogs.com/lgqtecng/p/6726216.html

如何在数据库中使用索引相关推荐

  1. oracle数据库中索值,Oracle数据库中的索引详解

    Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...

  2. 数据库中的索引原理阅读

    数据库中的索引原理阅读: 实际上,您可以把索引理解为一种特殊的目录.微软的SQLSERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclu ...

  3. 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新

    数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...

  4. mysql 查询数据库索引语句_利用SQL语句查询数据库中所有索引

    本章我们就要讲解一下如何利用sql语句来查询出数据库中所有索引明细.当然了,我们可以在microsoft sql server management studio中选择"表"- & ...

  5. MSSQL·查询数据库中所有索引的相关信息

    阅文时长 | 0.45分钟 字数统计 | 784字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询数据库中所有索引的相关信息』 编写人 | SCscHero 编写时间 ...

  6. 数据库中的索引优缺点分析

    数据库中的索引优缺点分析 创建索引的优点:      1:提高查询速度  2:降低查询中分组和排序的时间  3:可以加速表与表之间的连接       4:利用索引的唯一性来控制记录的唯一性  创建索引 ...

  7. MySQL数据库中的索引

    1. 索引的介绍 索引在MySQL中也叫做"键",它是一个特殊的文件,它保存着数据表里所有记录的位置信息,更通俗的来说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. ...

  8. mysql支持非关系_说下oracle、mysql、非关系型数据库中的索引结构?

    谢邀~~树懒君悉心整理了一篇索引结构方面的内容,跟各位知友分享分享~ Oracle 索引的数据结构:B-TreeOracle 数据库使用 B-trees 存储索引,来加速数据访问.若没有索引,你必须顺 ...

  9. B+树:MySQL数据库中建立索引的数据结构

    在MySQL数据库中是通过B+树的数据结构建立索引的. 相比二叉树,B树是一种多叉树,总层数更少,磁盘io次数也会相应减少.而与B树不同的是,B+树把索引和数据分开存储,数据以链表的形式存放在B+树的 ...

  10. MySQL数据库中的索引(含SQL语句)

    文章目录 为什么要用索引 索引是什么 索引的原理 优点 缺点 创建索引的原则 什么情况下需要索引 什么情况下不需要索引 索引的分类 主键索引 单值索引 唯一索引 组合索引(复合索引) 全文索引(仅在M ...

最新文章

  1. 获取树莓派4ip地址(手机热点获取)
  2. Eclipse 中maven插件坏死解决办法
  3. python语言句块的标记_Python语言语句块的标记是()
  4. android 横向滑动日期_移动端横向滑动如何设计?
  5. JavaSE----基础语法(方法)
  6. Understand Tasks and Back Stack--Defining launch modes
  7. linux python pymysql,Python之pymysql的使用
  8. 密码学专题 OpenSSL标准转换指令
  9. 线性查找法java代码_Java线性查找和二分查找
  10. vue怎么插入接口demo_vue项目如何设置接口
  11. Spring MVC拦截器(Interceptor)的配置及使用
  12. 进程间能否传递指针?
  13. Jmeter发送get请求
  14. 《云阅》一个仿网易云音乐UI,使用Gank.Io及豆瓣Api开发的开源项目
  15. Android抓包思想总结
  16. flag计算机领域的意思,flag是什么意思
  17. C语言 isdigit、isalnum、isalpha、islower、issupper用法及其示例
  18. 鼠友题库每日百题(四)
  19. 网络编程、通信三要素、UDP快速入门、TCP通信、即时通信、模拟BS系统
  20. Mysql联表查询(学生表、教师表、成绩表、课程表)

热门文章

  1. 如何在苹果Mac中设置 Excel 文件打印范围刚好是一页纸?
  2. inDesign文字教程,如何制作复古文本效果?
  3. 苹果mac预览应用使用方法
  4. 如何在 Mac 上查找路由器 IP 地址?
  5. 如何通过Multitouch为Mac电脑添加更多手势控制?
  6. PostgreSQL Heap Only Tuple - HOT (降低UPDATE引入的索引写IO放大)
  7. 测试 JavaScript 函数的性能
  8. 互联网+商业 济宁苏宁生活广场打造智慧城市范本
  9. IDEA与Maven Java普通项目
  10. Map Reduce学习