MySQL索引与性能(1) 索引类型

本文讨论MySQL支持的索引类型及其优缺点。要注意的是:在MySQL中,索引是在存储引擎层而不是服务器层实现,所 以不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。

B+树索引

B+树是一种经典的数据结构,由平衡树和二叉查找树结合产生,它是为磁盘或其它直接存取辅助设备而设计的一种平 衡查找树,在B+树中,所有的记录节点都是按键值大小顺序存放在同一层的叶节点中,叶节点间用指针相连,构成双向 循环链表,非叶节点(根节点、枝节点)只存放键值,不存放实际数据。下面看一个2层B+树的例子:

保持树平衡主要是为了提高查询性能,但为了维护树的平衡,成本也是巨大的,当有数据插入或删除时,需采用拆分 节点、左旋、右旋等方法。B+树因为其高扇出性,所以具有高平衡性,通常其高度都在2~3层,查询时可以有效减少IO次 数。

对于B+树复合索引来说,索引列的顺序非常重要,如果不是按照索引的最左列开始查找,则无法使用索引,也不能跳 过索引中的列。下面是一个复合索引的例子:

alter table t add key idx_a_b(a,b);

下图是它的结构图:

很显然,对于where a = xxx and b=xxx 这样的语句是可以使用这个复合索引的。现在看看对单个列的情况,where a = xxx也是可以使用该复合索引,因为a列在复合索引中也是有序的,但对于where b =xxx 这样的语句是无法使用该复 合索引,因为它是无序的。

哈希索引

哈希索引基于哈希表,只有精确匹配索引所有列的查询才有效。在MySQL中,只有Memory引擎显示支持哈希索引。

因为索引本身只需要存储对应的哈希值,所以索引的结构非常紧凑,这也让哈希索引的查找速度非常快,但它只支持 等值比较,所以只适用于某些特定的场合。

InnoDB有一个特殊的功能叫做“自适应哈希索引”,它会实时监控表上索引的使用情况,如果认为建立哈 希索引可以提高查询效率,则自动在内存中的“自适应哈希索引缓冲区”(详见《MySQL - 浅谈InnoDB体系 架构》中内存构造)建立哈希索引。之所以该技术称为“自适应”是因为完全由InnoDB自己决定,不需要DBA 人为干预。它是通过缓冲池中的B+树构造而来,且不需要对整个表建立哈希索引,因此它的数据非常快。InnoDB官方文 档显示,启用自适应哈希索引后,读和写性能可以提高2倍,对于辅助索引的连接操作,性能可以提高5被,因此默认情 况下为开启,我们可以通过参数innodb_adaptive_hash_index来禁用此特性。

空间数据索引(R-Tree)

MyISAM支持空间索引,可以用作地理数据存储,和B树索引不同的是,它从所有维度索引数据,无需前缀查询。查询 时,可以有效地使用任意维度来组合查询。

全文索引

全文索引是一种特殊类型的索引,它查找的是文本中的关键字,而不是直接比较索引中的值。全文索引更类似于搜索 引擎做的事情,而不是简单的where条件匹配。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/MySQL/

时间: 2025-01-02 14:43:51

MySQL索引与性能(1) 索引类型的相关文章

聚集索引,非聚集索引,唯一索引,索引视图

聚集索引对于从表中检索一定范围的数据值非常有用.非聚集索引最适于检索特定行,而聚集索引最适于检索一定范围的行.但是,由于每个表只允许使用一个聚集索引,因此按照这个简单的逻辑来确定要创建哪种类型的索引并不总能成功.对于该问题有一个简单的物理原因.对于聚集索引 B 树结构的上部(非叶层),如果像对它们的非聚集索引部分那样组织,则聚集索引的底层由表的实际 8 KB 数据页组成.但这种情况有一个例外,那就是在视图的基础上创建聚集索引时.因为将在下面介绍索引视图,所以我们将讨论针对实际表创建的聚集索引.在

MySQL索引与性能(3) 覆盖索引

覆盖索引是指索引的叶子节点已包含所有要查询的列,因此不需要访问表数据,能极大地提高性能.覆盖索引对 InnoDB的聚簇索引表特别有用,因为可以避免InnoDB二级索引的二次查询.MySQL里只有B树索引能做覆盖索引,因为必 须要存储索引列的值,而哈希索引.空间索引.全文索引不可以. 当发起一个覆盖索引的查询时,在explain的Extra列可以看到Using Index,下面看一个例子,在表users有一个多列 索引(login_id,status),执行计划如下 root@test 01:30

MYSQL创建、删除、索引和更改表

   3.4 创建.删除.索引和更改表    可利用CREATE TABLE.DROP TABLE 和ALTER TABLE 语句创建表,然后,对它们进行删除,更改它们的结构.对于它们中的每一条语句,存在MySQL专有的扩充,这些扩充使各语句更为有用.CREATE INDEX 和DROP INDEX 语句使您能够增加或删除现有表上的索引.    3.4.1CREATE TABLE 语句    用CREATE TABLE 语句创建表.此语句的完整语法是相当复杂的,因为存在那么多的可选子句,但在实际

MySQL 第六篇:索引与子查询

我把MySQL的内容整理成9篇博客,学完这9篇博客虽不能说能成为大神,但是应付一般中小企业的开发已经足够了,有疑问或建议的欢迎留言讨论. 子查询 子查询,从原有的查询语句中 嵌入新的查询 来得到我们想要的结果,也可称为嵌套查询. 一.where 型 1.查询课程名为"Java"的学生信息 -- 使用关联查询实现 SELECT s.* FROM students s, class c WHERE s.class_id = c.class_id AND c.class_name = 'JA

FAQ系列 | MySQL索引之主键索引

导读 在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别? 上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别. 1.主键索引 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录.一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL. 在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则: 采用一个没有业务用途的自增属性列作为主键: 主键字段值总是不更新,只有新增或者

Mysql学习笔记(九)索引查询优化

原文:Mysql学习笔记(九)索引查询优化 PS:上网再次看了一下数据库关于索引的一些细节...感觉自己学的东西有点少...又再次的啃了啃索引.... 学习内容: 索引查询优化... 上一章说道的索引还不是特别的详细,再补充一些具体的细节... 1.B-Tree索引... B-tree结构被称为平衡多路查找树...其数据结构为:     这就是其数据结构图...我们没必要完全的理解其中的原理..并且我也不会做过多的原理介绍...我们只需要知道数据库是以这种方式进行存储数据的就可以了...   m

MySQL索引之主键索引_Mysql

在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别? 上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别. 1.主键索引 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录.一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL. 在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则: 1.采用一个没有业务用途的自增属性列作为主键: 2.主键字段值总是不更新,只有新增或

Mysql中Btree 与 Hash 索引比较详解

mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引.hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们总是一对一的关系,用到的操作符只是=而已,假如使用hash作为索引数据结构的话,时间复杂度可以降到O(1).不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB两种引擎,而我们最常用的INNODB和MYISAM都不支持hash类型的索引. 不管怎样,还是要了解一下这两种索引的区别

MySQL索引之哈希索引和自适应哈希索引(Adaptive Hash Index)

MySQL索引之哈希索引和自适应哈希索引(Adaptive Hash Index)  官网:https://dev.mysql.com/doc/refman/5.6/en/innodb-adaptive-hash.html 索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 从MySQL逻辑架构来看,MySQL有三层架构,第一层连接,第二层查询解析.分析.优化.视图.缓存,第三层,存储引擎. 索引通过分开查询片,节省了扫描查找时间,大大