广告
返回顶部
首页 > 资讯 > 数据库 >数据库索引
  • 927
分享到

数据库索引

数据库索引 2017-04-03 06:04:09 927人浏览 猪猪侠
摘要

索引(index)是帮助Mysql高效获取数据的数据结构。常见的查询算法:顺序查找、二分查找、二叉树查找、哈希散列、分块查找、B树。   1)哈希算法:就是把任意长度值(key)通过散列算法变成固定长度的key地址,通过这个地址进行访问的数

索引(index)是帮助Mysql高效获取数据的数据结构。常见的查询算法:顺序查找、二分查找、二叉树查找、哈希散列、分块查找、B树。

  1)哈希算法:就是把任意长度值(key)通过散列算法变成固定长度的key地址,通过这个地址进行访问的数据结构。它通过关键码值映射到表中一个位置来访问记录,以加快查找速度。时间复杂度为O(1),寻址查询,不适用于范围查询,无法排序

  2)二叉树:它的左子节点值比父节点值小,右子节点值比父节点值大。时间复杂度为O(logN),缺点:不平衡二叉树。

  3)B树:度(degree)-节点的数据存储个数;叶节点具有相同的深度且指针为空;叶节点的数据key从左到右递增排序。

  4)B+树:真实的数据存在于叶子节点,非叶子节点不存储真实的数据,只存储指引搜索方向的数据项。

常见的索引原则:

  1)选择唯一性索引:唯一性索引的值是唯一的,可以更快速地通过该索引来确定某条记录。

  2)为常作为查询条件的字段建立索引、为经常需要排序、分组和联合操作的字段建立索引。

  3)限制索引的数目:越多的索引,会使更新表变得很浪费时间。

  4)尽量使用数据量少的索引:如果索引的值很长,那么查询的速度会受到影响。

  5)尽量使用前缀来索引:如果索引字段的值很长,最好使用值得前缀来索引。

  6)删除不再使用或很少使用的索引。

  7)最左匹配原则,是非常重要的原则。

  8)尽量选择区分度高的列作为索引。

  9)索引列不能参与运算,带函数的查询不能参与索引。

  10)尽量的扩展索引,不要新建索引。

创建索引

  1)创建表时,创建索引:

    create table 表名 (字段  数据类型 , [unique | fulltext | spatial][index | key] 索引名称 (被索引字段名[length]) [asc | desc] );

 1 CREATE TABLE book (
 2     bookid INT NOT NULL,
 3     bookname VARCHAR(255)NOT NULL,
 4     year_publication YEAR NOT NULL,
 5     UNIQUE INDEX UniquId(id),     ##唯一索引
 6     INDEX(year_publication),    ##普通索引
 7     INDEX SingleIdx(bookname(20)),    ##单列索引
 8     INDEX MultiIdx(bookid,bookname(100)),    ##组合索引
 9     FULLTEXT INDEX FullTextIdx(bookname),    ##全文索引(只支持MyISAM—>engine=MyISAM)
10     g GEOMETRY NOT NULL,
11     SPATIAL INDEX spatIdx(g)    ##空间索引(存储引擎必须为MyISAM且空间类型的字段为空值)
12 );

  2)在已经存在的表上创建索引:

    a. 使用 alter table 创建索引:alter table 表名 add [unique | fulltext | spatial] [index] 索引名称 (被索引字段名[length]) [asc | desc];

      例:alter table book add index BknameIdx(bookname(30));

    b. 使用 create index 创建索引:create [unique | fulltext | spatial] [index] 索引名称 on 表名 (被索引字段名[length]) [asc | desc];

删除索引

  1)使用 alter table 删除索引:alter table 表名 drop index 索引名称;

    例:alter table book drop index BknameIdx;

  2)使用 drop index 删除索引:drop index 索引名称 on 表名;

查看索引

  show index from 表名;

索引的分类:唯一索引/非唯一索引、主键索引(主索引)、聚集索引/非聚集索引、组合索引。

  1)唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

      如下表中,为“学号”建立索引:

        学号    姓名

      ------------------------------------

        001     张三

        002     李四

  2)非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

      如下表,为Score建立索引,可不唯一:

        Score    Name

          98     张三

          98     李四

  3)主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索引。一个表只能建立一个主索引。

  4)聚集索引(聚簇索引):表中记录的物理顺序与键值的索引顺序相同。一个表只能有一个聚集索引。

  扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用?

    聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺序是否一致。

    聚集索引的表中记录的物理顺序与索引的排列顺序一致。

      优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定无力的紧跟其后。

      缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。在插入记录时数据文件为了维持B+树的特性而频繁的分裂调整,十分低效。

    建议使用聚集索引的场合为:

      a. 某列包含了小数目的不同值;

      b. 排序和范围查找;

    非聚集索引的记录的物理顺序和索引的顺序不一致。

    其他方面的区别:

      a. 聚集索引和非聚集索引都采用了B+树结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。聚集索引的叶子节点就是数据节点,而非聚集索引的叶子节点仍然是索引节点。

      b. 非聚集索引添加记录时,不会引起数据顺序的重组。

    看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次B+树查找,这不是多此一举吗?聚簇索引的优势在哪?

      由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键id来组织数据,获得数据更快。

      辅助索引使用主键作为“指针”,而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时,辅助索引的维护工作,Innodb在移动行时无需更新辅助索引中的这个“指针”。也就是说行的位置会随着数据库里的数据的修改而发生变化,使用聚簇索引就可以保证不管这个主键B+树的节点如何变化,辅助索引树都不受影响。

    建议使用非聚集索引的场合为:

      a. 此列包含了大数目的不同值;

      b. 频繁更新的列;

  5)组合索引(联合索引):基于多个字段而创建的索引就称为组合索引。    

      创建索引

      create index idx1 on table1(col1,col2,col3);

      查询

      select * from table1 where col1=A and col2 =B and col3 = C;

    举例说明:给出一个多列索引(username,passWord,age),当三列在where中出现的顺序如(username,password,age)、(username,password)、(username)才能用到索引,如下面几个顺序(password,age)、(password)、(age)---这三者不从username开始,(username,age)---断层,少了password,都无法利用到索引。因为B+树多列索引保存的顺序是按照索引创建的顺序,检索索引时按照此顺序检索。 

数据库索引的原理(实现)

MyISAM索引实现

  MyISAM引擎使用B+树作为索引结构,叶子节点的data域存放的是数据记录的地址。在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

  MyISAM中索引检索的算法为首先按照B+树搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。MyISAM的索引方式也叫做“非聚集索引”。

InnoDB索引实现

  虽然InnoDB也使用B+树作为索引结构,但具体实现方式却与其截然不同。

  第一个重大区别是InnoDB的数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是B+树组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这种索引也叫做聚集索引。

  第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。  

索引的优缺点

  优点:大大加快了数据的检索速度;

     创建唯一性索引,保证数据库表中每行数据的唯一性;

     加速表和表之间的连接;

     在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

  缺点:索引需要占物理空间;

     当对表中的数据进行增加、删除和修改时,索引也要动态的维护,降低了数据的维护速度。

性别字段为什么不适合加索引?从B+树原理解释。

  尽量选择区分度高的字段作为索引,区分度的公式是count(distince col)/count(*),表示字段不重复的比例,比例越高我们扫描的记录数越少,唯一键的区分度为1,而一些状态、性别字段可能在大数据面前区分度为0。在性别字段上增加索引,并不能明显加快索引速度。

mysql的B+树索引的优点?为什么不用二叉树?B树和B+树为什么比红黑树更合适?

  数据库文件很大,需要存储到磁盘上,索引的结构组织要尽量减少查找过程中磁盘IO的读取次数。

  1)高度原因

    B+树中的每个节点可以包含大量的关键字,这样树的深度降低了,所以任何关键字的查找必须走一条从根节点到叶子节点的路,所有关键字查询的路径长度相同,导致每一个数据的查询效率相当,这就意味着查找一个元素只要很少节点从外存磁盘中读入内存,很快访问到要查询的数据,减少了磁盘IO的读取次数。

  2)磁盘预读原理和局部性原理

    将一个节点的大小设为等于一个页(16k),这样每个节点只需要一次IO就可以完全载入。

您可能感兴趣的文档:

--结束END--

本文标题: 数据库索引

本文链接: https://www.lsjlt.com/news/2751.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库索引
    索引(index)是帮助MySQL高效获取数据的数据结构。常见的查询算法:顺序查找、二分查找、二叉树查找、哈希散列、分块查找、B树。   1)哈希算法:就是把任意长度值(key)通过散列算法变成固定长度的key地址,通过这个地址进行访问的数...
    99+
    2017-04-03
    数据库索引
  • 数据库--索引
    索引索引是对数据库表中一个或多个列的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。没有索引的情况下,如果执行select * from ...
    99+
    2022-10-18
  • MySQL数据库引擎和索引
    一、MySQL 数据库引擎:1. Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的...
    99+
    2022-10-18
  • mysql数据库的索引
    day04  MySQL数据库的索引一、索引概述:    索引是由一张表中的某个列或多列组成,而创建索引的目的是为了更优化管理我们的数据库表,提升我们查询使...
    99+
    2022-10-18
  • 数据库中的索引
    目录 一、什么是索引? 索引的实现原理 什么时候考虑添加索引? 索引的类型 二、为什么要有索引? 三、怎么用索引? 索引的创建和删除 怎么查看一条sql语句中使用了索引? 索引失效的情况以及对应解决方案 一、什么是索引? 索引是数据...
    99+
    2023-09-02
    mysql
  • MYSQL(一)数据库索引类型,索引优点
    索引在mysql中也叫做键(key),是存储引擎用于快速找到记录的一种数据结构。索引结构类型(常见有两种):1. B-Tree索引大多数mysql引擎都支持这种索引;  &nb...
    99+
    2022-10-18
  • 数据库知识扫盲,数据库索引
    存储引擎 早期存储引擎都是把数据库相关数据固化到磁盘的,在并发上每张表都是表锁, 后期的存储引擎(例如innodb,in-memory等)大多都是元数据在磁盘上,索引数据在内存中,在并发上每张表都是行锁 2、磁盘型数据库索引 数据库如一本...
    99+
    2016-02-02
    数据库知识扫盲,数据库索引
  • mysql数据库索引用处
    本文主要给大家介绍mysql数据库索引用处,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql数据库索引用处吧。    &n...
    99+
    2022-10-18
  • 数据库之索引模块
    索引模块除了是数据库最重要的模块之一,也是面试中最经常被问到的,关于索引模块常见问题如下: 为什么要使用索引 什么样的信息能成为索引 索引的数据结构 密集索引和稀疏索引的区别 为什么要使用索引: 数据...
    99+
    2022-10-18
  • MySQL数据库唯一索引
    引言:什么是索引 创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利,莬费领...
    99+
    2023-09-06
    数据库 mysql sql qt教程 qt开发
  • mysql加索引,数据库卡死
    公司的一个内部项目,由于突然导入了几十万的数据,数据量翻了一倍,导致了某个页面打开很慢。通过sql日志看到主要是由于慢查询引起的,通过explain这个sql,发现主要是由于这个SQL没有命中索引,进行了全表扫描,慢是肯定了的。 为了优化这...
    99+
    2023-09-09
    数据库 mysql java
  • MySQL数据库索引介绍 - Mr
    一、什么是索引 索引是mysql数据库中的一种数据结构,就是一种数据的组织方式,这种数据结构又称为key 表中的一行行数据按照索引规定的结构组织成了一种树型结构,该树叫B+树 二、为何要用索引 优化查询速度 注意:只能加速索引字段 三、如...
    99+
    2016-01-29
    MySQL数据库索引介绍 - Mr
  • mysql数据库的索引类型
    索引类型介绍:主键索引primary key() 要求关键字不能重复,也不能为null,同时增加主键约束 主键索引定义时,不能命名唯一索引unique index() 要求关键字不能重复,同时增加唯一约束普...
    99+
    2022-10-18
  • 数据库索引有什么用
    这篇文章将为大家详细讲解有关数据库索引有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据库索引的作用是:可以快速访问数据库表中的特定信息。索引能提高数据的搜索及检...
    99+
    2022-10-18
  • mysql数据库索引如何做?
    MySQL索引底层的实现,今天简单聊一聊,少讲“是怎么样”,更多说说“为什么设计成这样”。 问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候...
    99+
    2022-10-18
  • 如何设计数据库索引
    本篇内容主要讲解“如何设计数据库索引”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何设计数据库索引”吧!MySQL中的索引MySQL中的InnoDB引擎使用B...
    99+
    2022-10-18
  • MySQL数据库高级(六)——索引
    MySQL数据库高级(六)——索引 一、索引简介 1、索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。M...
    99+
    2022-10-18
  • MySQL数据库的常用索引
    MySQL数据库的常用索引 本文关键字:数据库、MySQL、索引的作用、常用索引在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。 一、索引概述 1. 数据库检索 ...
    99+
    2022-01-24
    MySQL数据库的常用索引 数据库入门 数据库基础教程 数据库 mysql
  • 数据库如何创建索引
    数据库创建索引的方法打开需要操作的数据表。通过create index命令来添加索引。语法:CREATE [ UNIQUE ] [ CLUSTERED| NONCLUSTERED ] INDEX index_name ON { table ...
    99+
    2022-10-13
  • MySQL数据库索引和事务
    目录1. 索引 1.1 概念 1.2 作用 1.3 索引的原理 1.3.1 减少磁盘的访问次数是构建索引的核心思想 1.3.2 B+ 树适用实现索引的底层 1.4 适用场景 1.5 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作