数据库查询性能优化之利器—索引(二)

  在前面一篇文章中谈到适当地建立索引能够大幅度地提升SQL语句查询速度,然而并不是在什么情况下都适合建立索引,下面来谈一下什么情况下适合建立索引、建立什么样的索引以及建立索引带来的好处和坏处。

一.索引的概念

  广义的索引是指:将具有检索意义的事项按照一定方式排列,以方便进行检索。数据库中的索引是指:将数据库表中的一列或者多列按照一定的方式进行组织以方便对数据库表中的内容进行查询。

  字典是广义的索引最好的例子,比如我们在字典中查找"陈"字,有两种查找方式:拼音查找和偏旁查找。拼音查找的前提是知道这个字的大概读音是"chen",然后去目录的拼音页列表查找到拼音为"chen"的汉字所在的页码,比如找到拼音为"chen"的汉字所在的起始页码为100,然后就会直接把字典翻到100页,如果该汉字恰好在100页,则查找到该汉字了,如果不在100页,那么继续往后面翻几页就会找到该汉字了。进行偏旁查找不需要知道该汉字的读音,只需要先在目录的偏旁列表中找到" 阝"对应的页码比如说12,然后去12页找到"陈"字所在的具体页码比如说101,最后只需要直接把字典翻到101页就可以看到"陈"字了。试想一下如果字典没有这个目录,要想在字典中找到某个汉字的话是很难的,最直接的办法可能就是从字典的正文第一页逐页查找直到找到该汉字为止,这个过程所耗费的时间是可想而知的,可能找一上午都找不到要找的汉字。

  数据库中的索引跟字典的目录类似。数据库文件中的内容是存储在磁盘上的,当在数据库中查找记录时,如果能获得该记录在磁盘上存储的位置,就能迅速找到该记录,就跟查找汉字一样,否则的话就只有对数据库表中的所有内容进行扫描,直到找到符合条件的记录为止,这样显然会消费很多的时间。因此适当地创建索引能够加快查询速度。比如,我有一张表

  peple( id integer(PK), name varchar(40) , age tinyint , tel varchar(20) )

  里面有若干条数据:

1 Tom 20 8544345
2 Mark 28 6789353
3 Jim 18 13945673456
4 Jack 20 8675456
5 Jemyy 12 6789456

  然后执行语句 select * from people where name='Jemyy';

  会对所有的数据记录进行扫描逐一进行条件匹配,直到找到符合条件的记录。如果在name列上建立了索引,与字典的目录进行类比,假如把name列按照字母升序进行排列,然后可能就得到一个目录:

Jack 第四条记录的存储位置
Jemyy 第五条记录的存储位置
Jim 第三条记录的存储位置
Mark 第二条记录的存储位置
Tom 第一条记录的存储位置

  查找的时候先找到Jemyy得到该记录的存储位置,然后根据存储位置获取该记录的内容。上面过程只是类比字典的查找对索引的一个理解,实际当中SQL利用索引进行查找的过程可能跟上面略有不同(没有研究过实际的SQL利用索引进行查找的过程,这个估计得需要读SQL引擎的源码),但是原理是类似的。

二.索引的分类

  根据索引项与表中记录的物理顺序是否一致索引可以分为聚簇索引和非聚簇索引。索引项的顺序与表中记录的物理顺序一致的索引称作为聚簇索引,不一致的索引则称为非聚簇索引。比如字典的拼音查找目录就是聚簇索引,而偏旁查找目录则是非聚簇索引。

  根据索引包含的列的多少分为多列索引和单列索引,在创建索引的时候,可以选择在某一列上创建索引,也可以选择在多个列上创建索引。

   还有一种叫做唯一索引,表示此索引的每一个索引项对应一个唯一的数据记录。

  根据聚簇索引和非聚簇索引的概念可以知道,在一张表上只会有一个聚簇索引,因为一张表中的记录的物理顺序规则只有一种,而可以有多个非聚簇索引。

三.索引的创建

  在创建索引之前,要考虑好是否适合在某些列上创建索引,创建聚簇索引还是非聚簇索引,是创建单列索引还是多列索引,亦或是唯一索引。

  创建索引的SQL语句格式为:

create [unique][cluster|noncluster] index indexname on tablename([column asc|desc,column asc|desc..)

  在创建索引时,unique和cluster|noncluster以及asc|desc是可选的,当没有指定索引为唯一索引时,默认为非唯一索引;没有指定索引为聚簇索引还是非聚簇索引时,则默认为非聚簇索引;没有指定索引值的排序方式时,默认为asc升序。

  一般情况下来说,在经常需要进行搜索、进行外连接以及排序的列上比较适合建立索引,而很少使用到或者需要经常被修改的列上则不适合建立索引。建立索引虽然能够加快查询速度,但是同时也为数据库的维护带来了不便。由于要对索引进行存储,所以建立索引带来了额外的空间消耗;并且建立索引对数据库的修改造成了很大的不便,当要往数据库里插入数据或者修改数据时,索引也会随之自动进行修改,这个时候会带来很大的时间消耗。因此如果在一开始没考虑好,比如在需要经常修改的列上建立索引,后期的维护是很麻烦的。

  当需要返回某个范围内的值的时候,选择创建聚簇索引是比较合适的,就跟拼音查找类似,可以找到读音为"chen"的若干个汉字。

  而对于多列索引和单列索引的选择则一般需要根据where子句的判断条件来选择。比如:

select * from peple where name='jack'

  此时则适合在name列上建立单列索引,而

select * from peple where name='jack' and age>20

  此时则适合在name和age列上创建多列索引,这样更能够加快查询速度。索引的使用具有最左前缀匹配原则,当判别条件中存在索引的引导列时会使用该索引。假设people表有四个索引nameindex(name),ageindex(age),telindex(tel),mutilindex(name,age,tel)。

  select * from peple where name='jack' 会选择使用nameindex索引,而select * from peple where name='jack' and age>20则会选择使用mutilindex,注意一次查询只能使用上面4个索引中的一个索引。对于mutilindex,若判别条件为(name),(name,age),(name,age,tel),(name,tel)等都可以使用该索引,而(age,tel),(tel)都不能够使用该做引。

转载于:https://www.cnblogs.com/dolphin0520/archive/2012/09/03/2659755.html

数据库查询性能优化之利器—索引(二)相关推荐

  1. mysql获取查询策略语句_MySQL数据库查询性能优化策略

    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...

  2. 数据库查询速度优化 1 建立索引

    rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cjoe%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C ...

  3. MySQL 常见的数据库查询性能优化手段

    简单介绍了一些常见MySQL数据库优化手段,比如减少数据访问.使用索引.使用关联查询等等. 文章目录 1 优化数据访问 2 重构查询 2.1 优化子查询 2.2 优化GROUP BY和DISTINCT ...

  4. SQL Server 查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化--覆盖索引(一)  中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索 ...

  5. Sql Server查询性能优化之索引篇【推荐】

    Sql Server查询性能优化之索引篇[推荐] 这篇是索引系列中比较完整的,经过整理而来的 一 索引基础知识 索引概述 1.概念 可以把索引理解为一种特殊的目录.就好比<新华字典>为了加 ...

  6. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  7. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  8. 【Elasticsearch】Elasticsearch的IndexSorting:一种查询性能优化利器

    1.概述 转载:Elasticsearch的IndexSorting:一种查询性能优化利器 前言 前两周写过一篇<基于Lucene查询原理分析Elasticsearch的性能>,在最后留了 ...

  9. 面向程序员的数据库访问性能优化法则

    面向程序员的数据库访问性能优化法则 特别说明: 1.   本文只是面对数据库应用开发的程序员,不适合专业 DBA , DBA 在数据库性能优化方面需要了解更多的知识: 2.   本文许多示例及概念是基 ...

最新文章

  1. WML元素及其语法格式一览表
  2. Javascript 方法大全
  3. 全网最具有挑战的NLP训练营是什么样的?
  4. 关于ESXI能虚拟出多少个虚拟机和CPU的关系
  5. scala 转换为字符串_如何在Scala中将字符串转换为布尔值?
  6. 【C语言】shape of you
  7. 宝塔linux修改默认编码,宝塔linux面板防护CC设置(示例代码)
  8. TeamViewer和远程桌面冲突的问题
  9. JavaScript监听键盘事件,组合键事件
  10. 度量学习DML之MoCO
  11. 适用智能电表,热能表,气表等段码LCD液晶显示驱动芯片I2C 接口VK2C22A/B,RAM映射44*4, 40*4
  12. python读取 xls,xlsx,csv,doc,docx,pdf 格式的文件
  13. java连接oracle报错ora-12505,Oracle SQL Developer连接报错(ORA-12505)的解决方案(两种)
  14. 【信号处理】基于蚁群优化随机共振检测附matlab代码
  15. KRPANO技术解析并下载720YUN全景图
  16. 2019计算机考研大纲考什么,2019计算机考研大纲有哪些变动
  17. 【图像加密】基于混沌系统进行灰度图像加密附Matlab代码
  18. PHP 利用文件锁处理高并发
  19. C++:错误:ISO C++ forbids in-class initialization of non-const static member ‘A::b’
  20. 【人脸识别】基于facenet_pytorch实现人脸识别

热门文章

  1. 制造业与计算机有关的岗位,天津人力资源:零批餐饮挺缺人 银行地产岗位少...
  2. 034_Tabs标签页
  3. 026_CSS内边距
  4. 008_logback配置语法
  5. android 模拟飞行,安卓版模拟飞行 X Plane 9试玩
  6. 开源全能播放器Vitamio的使用
  7. 阿里云上测试服务器的搭建
  8. 关于MVVM与MVC
  9. FPM傅里叶叠层衍射成像笔记
  10. SpringBoot开发最佳实践