mysql的索引有哪些

MySQL的主要索引如下:1、B树索引(INDEX或KEY):最基本的索引,用于快速查找信息。
大多数MySQL存储引擎,例如InnoDB和MyISAM,都使用B树结构进行索引。
通过建立有序的数据结构,快速定位数据记录。
在进行数据查询时,可以通过索引快速找到对应的数据块,从而大大提高查询的效率。
2、哈希索引(HASH):适合同一个查询,可以快速找到数据的具体位置。
MySQL中的MEMORY存储引擎支持哈希索引。
哈希索引的特点是通过根据键值计算哈希值来快速访问数据。
值得注意的是,哈希索引无法避免不同节点之间数据的整合,因此对于重复键值较多的列建立哈希索引并不是一个好的选择。
另外,当内存中的哈希表规模较大时,性能和存储空间都会受到影响。
因此,在实际应用中,需要根据一定的条件选择使用哈希索引。
3.空间索引(R-tree):主要用于索引点、线、多边形等地理空间数据类型。
MySQL的MyISAM存储引擎支持空间索引。
空间索引主要应用于范围查询、空间数据查询等场景,可以极大地提高空间数据的查询效率。
空间索引非常适合地理信息系统等应用场景。
此外,还有一些其他特殊类型的索引,如全文索引等。
4、复合索引:复合索引是由多个列组成的索引。
创建聚集索引时,需要考虑列如何排列和组合,以便查询时能够充分利用索引。
复合索引适用于需要基于多列进行条件查询的情况,可以提高查询的效率,减少数据库的负载。
需要注意的是,列序和复合索引需要根据实际情况进行优化,才能充分发挥性能优势。
总之,MySQL需要不同的应用场景它提供了多种索引来补充。
在实际应用中,需要根据数据的特点和查询需求选择合适的索引类型,并对其进行优化和调整,以达到最佳性能。

为什么mysql索引要用b+树,而不是b树?

在分析MySQL为什么使用B+树作为索引数据结构之前,我们需要从数据结构和磁盘I/O操作次数的角度来考虑。
MySQL数据是持久化的,即存储在磁盘上磁盘的读写速度比内存慢很多因此,我们希望索引结构能够以尽可能少的磁盘I/O操作来解决查询任务。
为MySQL索引设计合适的数据结构,至少应该满足以下要求:高效查询单条记录并支持范围搜索。
接下来我们将一一分析二分查找、二叉查找树、平衡二叉树、B树和B+树,来了解为什么B+树是MySQL索引的首选。
首先,二分查找法在有序数组中查找特定元素,时间复杂度为O(logn),但每次查找都需要连续计算中间位置。
接下来介绍二叉搜索树,它通过分别使用小于和大于节点值的节点的左子树和右子树来实现高效搜索,同时解决了数组回移的问题。
插入元素。
但在极端情况下(每次都输入最大值),二叉搜索树会退化为链表,导致搜索时间复杂度增加到O(n)。
为了解决二叉搜索树的退化问题,平衡二叉树(如AVL树)通过限制每个节点左右子树的高度差不超过1,使查询时间复杂度始终为O(logn)。
虽然树结构是平衡的,但每个节点最多有两个子节点的限制意味着树的高度可能仍然很高,影响查询效率。
B树通过允许每个节点最多有多个子节点来降低树的高度,从而减少磁盘I/O操作的次数。
但树B的每个节点都包含数据(索引+记录),这导致查询基节点时需要更多的磁盘I/O操作,并且在进行范围查找时效率降低。
在这种背景下,B+树就出现了,它不仅允许每个节点有多个子节点来降低树的高度,而且还优化了非叶子节点的结构,使其只包含索引,不包含实际内容。
数据。
这样的设计使得B+树在单点查询、插入、删除和范围查询方面更加高效,特别是优化了磁盘I/O操作的数量。
综上所述,MySQL基于磁盘I/O操作的效率考虑以及对查询、插入、删除和范围查找性能的综合优化,选择B+树作为索引数据结构。
在大数据量、高频次操作的场景下,B+树的效率使得MySQL能够提供更快的查询响应,提高整体数据处理性能。

图解MySQL索引:B-树、B+树

什么是索引?

索引是一种帮助MySQL高效获取数据的数据结构。

索引能做什么?

提高数据查询效率。

索引:排序数据结构,方便快速搜索!索引影响“where”的搜索和“orderby”的排序。

从存储结构上分:BTree索引(B树或B+树索引)、哈希索引、全索引全文索引、R树索引。
与应用层分离:普通索引、唯一索引、复合索引。
根据数据的物理顺序和键值的逻辑(索引)顺序:聚集索引、非聚集索引。

普通索引:即一个索引只包含单列,一个表可以有多个单列索引。

唯一索引:索引列的值必须唯一,但允许为空值。

复合索引:这意味着一个索引包含多个列。

聚集索引(clusteredindex):它不是一种单独的索引类型,而是一种数据存储方式。
具体细节取决于实施。
InnoDB的聚集索引实际上将B树索引(技术上是B+Tree)和数据行存储在相同的结构中。

非聚集索引:要么是聚集索引,要么是非聚集索引(严肃脸)。

哈希索引

基于哈希表实现,只有完全匹配索引所有列的查询才是有效的。
对于每一行数据,存储引擎都会计算所有索引列的哈希值。
代码(hashcode)和哈希索引存储了索引中的所有哈希码,同时存储了指向索引表中每行数据的指针。

B-Tree索引(MySQL使用B+Tree)

B-Tree可以加快数据访问速度,因为存储引擎不再需要执行全表扫描来检索数据。
分布在不同的节点上。

B+Tree索引

它是B-Tree的改进版本,也是数据库索引使用的存储结构。
数据全部位于叶节点上,并且添加了指向相邻叶节点地址的顺序访问指针。
与B-Tree相比,范围搜索只需要找到两个节点并遍历它们。
B-Tree需要检索所有节点,而B+Tree效率更高。

结合存储引擎讨论(一般默认使用B+Tree)

案例:假设有一个学生表,以ID为主键。

MyISAM引擎中的实现(二级索引也是这样实现的)

InnoDB中的实现

插入连续数据:

插入非连续数据

为什么索引结构默认是B树而不是哈希、二叉树或者红黑树?Hash:虽然可以快速定位,但是没有顺序,I/O复杂度较高。
二叉树:树的高度不均匀,不能自平衡。
搜索效率取决于数据(树的高度),I/O成本较高。
红黑树:树的高度随着数据量的增加而增加,I/O成本较高。

为什么官方推荐使用自增主键作为索引?结合B+Tree的特点,自动增长的主键是连续的,插入过程中页面分裂最小化。
即使进行了页面分割,也只是分割了一小部分。
它可以减少数据移动,并且任何插入就是插入到最后。
简而言之,就是减少共享和搬家的频率。