mysql索引怎么回事 mysql索引失效的原因

Mysql InnoDB索引原理

理解Mysql索引的原理和数据结构有助于我们更好的使用索引以及进行SQL优化,索引是在存储引擎层面实现的,所以不同的引擎实现的索引也有一定的区别,但是在生产环境中,我们最常用的就是InnoDB引擎和B树索引,OK,那本文要讨论的重点也同样是 InnoDB引擎下的B树索引 。

创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站制作、成都网站制作、乐业网络推广、微信小程序开发、乐业网络营销、乐业企业策划、乐业品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供乐业建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

我们建立一个表来进行测试,表的DDL如下所示,我们要关注的是表t_book上的主键索引id和name author publish_date三列组成的索引test_index。

Mysql中的B树索引是使用B+树实现的,关于B+树的数据结构个人认为美团点评技术博客中Mysql索引原理及慢查询优化一文中介绍的非常详实,B+树的数据结构如下图所示。

图中浅蓝色块即磁盘块,根节点磁盘块中存储17和35两个数据,其中指针P1指向小于17的数据,指针P2指向大于17小于35的数据,指针P3指向大于35的数据。显然通过B+树索引查询数据与B+树的高度有关,如上图的B+树索引查找一个叶子节点的数据只需要三次磁盘IO,对于Mysql来说三层的B+树可以索引上百万的数据,这对于查询效率的提升是巨大的。

总结起来Mysql中B树索引有以下关键特点:

Mysql中的B树索引有两种数据存储形式,一种为聚簇索引,一种为二级索引。

InnoDB一般会使用表的主键来作为聚簇索引,如果一个表没有主键(不建议这么玩)InnoDB会选用一个唯一非空索引来代替,如果没有这样的索引,InnoDB会隐式建立一个聚簇索引。聚簇的含义即是数据行和相邻的键值紧凑的存储在一起,占据一块连续的磁盘空间,因此通过聚簇索引访问数据可以有效减少随机IO,通常使用聚簇索引查找比非聚簇索引查找速度更快。以我们建立的表t_book为例,聚簇索引即为自增主键id,其B树索引数据结构可以用下图来表示。

聚簇索引有以下关键特点:

InnoDB的B树索引中除了聚簇索引,就都是二级索引了,二级索引的含义是索引的叶子节点除了存储了索引值,还存储了主键id,在使用二级索引进行查询时,查找到二级索引B树上的叶子节点后还需要去聚簇索引上去查询真实数据,但是这里有一种特殊情况,即查询所需的所有字段在二级索引中都可以获取,此时就不需要再去回表查数据了,这种情况就是索引覆盖(EXPLAIN中EXTRA列中会出现USING INDEX,本文只关注索引结构,不详细讨论索引覆盖等技术的使用,如果深入理解索引的数据结构,索引覆盖等技术也没有那么神秘)。

在我们的测试表t_book中,test_index即为二级索引,由于我们把除了主键id所有的列都作为一个联合索引,所以在这个表上的查询都可以使用索引覆盖技术,但是具体生产环境中也不建议总是采用这种做法,索引列的增加也会增大插入更新数据时的索引更新成本,具体的优化要视具体情况决策。t_book上的二级索引test_index的索引结构由下图表示。

通过以上结构,我们可以推断出二级索引的以下关键特点:

索引覆盖:

最左前缀匹配:

二级索引可以说是我们在Mysql中最常用的索引,通过理解二级索引的索引结构可以更容易理解二级索引的特性和使用。

最后聊点轻松的索引结构,哈希索引就是通过哈希表实现的索引,即通过被索引的列计算出哈希值,并指向被索引的记录。

哈希索引有如下特性:

Mysql索引原理及慢查询优化

高性能Mysql 第三版

解释mysql中什么是索引?它的作用是什么?

索引的意义 ·索引在数据库中的作用相当于目录在书籍中的作用类似,都用来提高查找信息的速度。 ·索引是一个表中所包含值的列表,其中注明了表中包含各个值的行所在的存储位置,使用索引查找数据时,先从索引对象中获得相关列的存储位置,然后再直接去其存储位置查找所需信息,这样就无需对这个表进行扫描,从而可以快速的找到所需数据。

mysql索引有什么用?

先正面回答你的问题

数据是否重复不是建立索引的重要依据,甚至都不是依据。

只要不完全重复(所有元组的该元素都一样),那么建立索引就是有意义的。

即使当前数据完全重复,也不是不能建立索引,这种情况有点复杂,不细说了。

对于你后面的疑问,可以给你一个如何建立索引的忠告,“如何查就如何建”。

索引的建立,唯一的原因就是为了查询(广义的查询),实际上建立索引会使得数据存储所占空间变大,有时索引所占的空间会查过数据本身的空间。索引的建立也会使得数据插入时变慢,特殊情况下,慢的难以忍受,所以dba的重要工作之一,就是检查索引层级并优化。

索引建立的唯一好处,就是按照索引查询时,变快了。type,status这2个字段是否适合建立索引,就要看你是否要按照这2个字段进行检索。而检索的顺序决定了如何建立索引。

对于索引类型和索引方式,我建议就

normal

btree

就适用于大多数情况。若你参与的是一个大数据处理项目,对数据存储和检索有特别要求,那么需要分析多个层面,比如数据吞吐量、数据的方差、平均差等等很多参数才考虑是否用聚集索引等(mysql好像还没聚集索引),至于是否是唯一索引,我建议不使用,即使能判定数据是唯一的也不要用,全文索引也没有必要。

MySQL 索引是怎么实现的?

索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。

具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。


网页名称:mysql索引怎么回事 mysql索引失效的原因
文章出自:http://ybzwz.com/article/doihpdg.html