`
student_lp
  • 浏览: 428587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详解MySQL索引类型和索引优点

阅读更多

    索引是存储引擎用于快速查找记录的一种数据结构。因此良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能不明显,但当数据量逐渐增大时,性能则会急剧下降。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能要好两个数量级。

    索引可以包含一个或多个列的值。如果索引包含多个列,那么列的顺序也十分重要,因为mysql只能高效的使用索引的最左前缀列。创建一个包含列个列的索引,和创建两个只包含一列的索引是大不相同的。

    在mysql中,索引是存储引擎层而不是服务器层实现的。不同的存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也不能不同。

一、索引类型

1、B-Tree索引

    大多数mysql存储引擎都支持B-Tree索引。存储引擎以不同的方式使用B-Tree索引,性能也各不相同。例如,MyISAM使用前缀压缩技术使得索引更小,但InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。

    B-Tree通常意味着所有的值都按顺序存储的,并且每一个叶子页到根的距离相同。B-Tree索引能够加快访问数据的速度,因为存储引擎不在需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到适合的指针进入下层子节点,这些指针实际上定义了子节点页中值的下限和上限。最终存储引擎要么找到对应的值,要么改记录不存在。

    叶子节点比较特别,他们的指针指向的是被索引的数据,而不是其他的节点页。在根节点和叶子节点之间可能有很多层节点页。树的深度和表的大小直接相关。B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据。例如,在一个基于文本域的索引树上,按字母顺序连续的值进行查找是非常适合的,所以像“找出所有以I到K开头的名字”这样的查找效率会非常高。


     B-Tree索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于根据最前缀的查找。前面所述的索引对如下类型的查询有效:①全值匹配。索引中所有列进行匹配;②匹配最左前缀;③匹配列前缀。在满足最左前缀的基础上匹配最左列的开头部分;④配置范围值。最左列的某一范围内的数据;⑤精确匹配最左列并范围匹配最左列的相邻列;⑥只访问索引的查询。需要查询的字段在索引列中都包含,所以在索引的叶子节点上就可以获取到这些列的值,无需查询数据行。因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查找中的order by操作。一般来说,如果b-tree可以按照某种方式查找到值,那么也可以按照某种方式用于排序。所以,如果order by子句满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求

     下面是一些关于b-tree索引的限制:①如果不是按照索引的最左列开始查找,则无法使用索引;②不能跳过索引中的列;③如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。到这里可以看到前面的索引列的顺序是多么的重要:这些限制和索引列的顺序有关。在优化性能的时候,可能需要使用相同的列但顺序不相同的索引来满足不同类型的查询需求。

2、哈希索引

    哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希吗,哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

    在mysql中,只有memory引擎显示的支持哈希索引。这也是memory引擎表的默认索引类型,memory引擎同时也支持B-Tree索引。并且索引自身只需要存储对应的哈希值,所以索引的结构十分紧凑,这也让哈希索引的速度非常快。然而,哈希索引也有它的限制:

  • 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能的影响并不明显。
  • 哈希索引数据并不是按照索引值的顺序存储的,索引也就无法用于排序。
  • 哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
  • 哈希索引只支持等值比较查询,包括=、in()、<=>(注意<>和<=>是不同的操作)。也不支持任何范围查询。
  • 访问哈希索引的数据非常快,除非有很多哈希冲突。当出现哈希冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。
  • 如果哈希冲突很多的话,一些索引维护操作的代价也会很高。

    因为这些限制,哈希索引只适用于某些特定的场合。而一旦适合哈希索引,则他带来的性能提升非常显著。除了memory引擎外,NDB集群引擎也支持唯一哈希索引。InnoDB引擎有一个特殊的功能叫做“自适应哈希索引”,当InnoDB注意到某些索引值被使用的非常频繁时,他会在内存中基于b-tree索引之上再创建一个哈希索引,这样就让b-tree索引也具有哈希索引的一些优点。

3、空间数据索引(R-Tree)

    MyISAM表支持空间索引,可以用作地理数据存储。和B-Tree索引不同,这类索引无需前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效的使用任意维度来组合查询。必须使用mysql的GIS相关函数来维护数据。

4、全文索引

    全文索引是一种特殊类型的索引,他查找的是文本中的关键词,而不是直接比较索引中的值。全文搜索和其他几类索引的匹配方式完全不一样。他有许多需要注意的细节,如停用词、词干和负数、布尔搜索等。全文索引更类似于搜索引擎的事情,而不是简单的where条件匹配。

    在相同的列上同时创建全文索引和基于值的b-tree索引不会有冲突,全文索引适用于match against操作,而不是普通的where条件操作。

二、索引优点

   索引可以让服务器快速定位到表的指定位置。但是这并不是索引的唯一作用,到目前为止可以看到,根据索引的数据结构不同,索引也有一些其他的附件作用。

    常见的b-tree索引,按照顺序存储数据,所以mysql可以用来做order by和group by操作。因为数据是有序的,所以b-tree也就会将相关的列值都存储在一起。最后,因为索引中存储了实际的列值,所以某些查询只使用索引就能够完成全部查询。据此特性,总结下来索引有如下三个优点:

  • 索引大大减少了服务器需要扫描的数据量;
  • 索引可以帮助服务器避免排序和临时表;
  • 索引可以将随机I/O变为顺序I/O;

注意:索引是最好的解决方案吗?

    索引并不总是最好的工具。总的来说,只有当索引帮助存储引擎快速查找到记录带来的好处大于其带来的额外工作时,索引才是有效的。对于非常小的表,大部分情况下简单的全表扫描更高效。对于中到大表,索引就非常有效。但对于特大型的表,建立和使用索引的代价将随之增长。这种情况下,则需要一种技术可以直接区分出查询需哟的一组数据,而不是一条记录一条记录的匹配。例如可以使用分区技术。

  • 大小: 67.8 KB
分享到:
评论

相关推荐

    MySQL Innodb 索引原理详解

    MySQL Innodb 索引原理详解

    详解mysql索引总结----mysql索引类型以及创建

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。这篇文章主要介绍了详解mysql索引总结----mysql索引类型以及创建,有兴趣的可以了解一下。

    详解mysql索引总结—-mysql索引类型以及创建

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    在关系数据库中,索引是一种单独对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的...在MySQL数据库一共支持5种类型的索引和9种索引失效的场景,下面,我来进行一一介绍。

    Mysql覆盖索引详解

    1、覆盖索引也并不适用于任意的索引类型,索引必须存储列的值 2、Hash 和full-text索引不存储值,因此MySQL只能使用B-TREE 3、并且不同的存储引擎实现覆盖索引都是不同的 4、并不是所有的存储引擎都支持它们 5、如果...

    mysql 索引详细介绍

    在mysql 中,索引可以分为两种类型 hash索引和 btree索引。  什么情况下可以用到B树索引?  1.全值匹配索引  比如: orderID=”123”  2.匹配最左前缀索引查询  比如:在userid 和 date字段上创建联合索引。 ...

    Mysql面试过关!(详解:索引+常用引擎+常见问题+sql调优)

    一、Mysql索引 1、添加索引sql语句 2、查看MySQL中建立的索引是否生效 3、索引失效场景(补充:以下在实际应用中并不会一定导致索引失效,基于mysql不同版本的优化规则) 3.1 在联合索引的场景下,查询条件不满足最...

    MySQL索引操作命令详解

    [UNIQUE|FULLTEXT|SPATIAL]:中括号中的三个关键字表示创建的索引类型,他们分别表示唯一索引、全文索引、空间索引三种不同的索引类型。如果我们不指定任何关键字,则默认为普通索引。 index_name:表示索引的名字,...

    Mysql索引的类型和优缺点详解

    这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进 行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE...

    mysql,查询,索引

    1、MySQL索引原理 2、索引⽬的 3、磁盘IO与预读 4、索引的数据结构 5、详解b+树 6、b+树的查找过程 7、b+树性质 8、慢查询优化 9、建索引的⼏⼤原则 1、最左前缀匹配原则 2、=和in可以乱序 3、尽量选择区分度⾼的...

    详解mysql中的冗余和重复索引

    mysql允许在相同列上创建多个索引,无论是有意还是无意,mysql需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能。  重复索引是指的在相同的列上按照相同的顺序创建的相同...

    Mysql数据库从入门到精通.rar

    6.MySQL索引分类和各自用途 7.MySQL中的字符串比较函数 8.MySQL中字符串函数详细介绍 9.都出深入SELECT语句的查询功能 10.浅谈MySQL存储引擎选择InnoDB还是MyISAM 11.浅谈unique列上插入重复值的MySQL解决方案 12....

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ │ 3_MySQL索引类型介绍.mp4 │ │ 4_MySQL索引底层结构和执行计划.mp4 │ │ 5_MySQL索引优化原则.mp4 │ │ 6_MySQL运维常见错误part1.mp4 │ │ 7_MySQL运维常见错误part2.mp4 │ │ ERROR1040_1917970.1.pdf ...

    Mysql建表与索引使用规范详解

    四、 MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。五、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段...

    MySQL索引背后的数据结构及算法原理详解

    特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常...

    mysql之explain使用详解(分析索引)

    explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上explain就可以了,如: explain select * from statuses_status where ...

    MySQL中索引与视图的用法与区别详解

    所有的Mysql列类型都可以被索引。 mysql支持BTREE索引、HASH索引、前缀索引、全文本索引(FULLTEXT)【只有MyISAM引擎支持,且仅限于char,varchar,text列】、空间列索引【只有MyISAM引擎支持,且索引的字段必须非空】...

    MySQL性能优化详解.docx

    减少不必要的计算和转换:在查询中尽量避免进行复杂的计算和数据类型转换,这些操作会增加CPU负担。 使用批量操作:对于大量数据的插入、更新或删除,使用批量操作可以减少I/O次数,提高效率。 监控和分析慢查询:...

Global site tag (gtag.js) - Google Analytics