Mysql索引

Mysql索引

索引的相关概念

  • Mysql索引是什么

    数据库系统还维护这满足某种特定查找算法的数据结构 这些数据结构以特定的方式指向数据 这种

    数据结构就是索引

    看一个例子:

在这里插入图片描述

上图展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找获取到相应数据

  • 索引的优点

    1)提高检索效率,降低I/O成本
    2)通过索引对数据进行排序,降低数据排序成本,降低CPU消耗

  • 索引的缺点

    1)虽然提高了查询效率,但降低了更新效率(每次INSERT、UPDATE、DEIETE,Mysql不仅要保存数据,还要更新索引文件)
    2)索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引也要占用空间

    索引相关数据结构对比

    • BTree 多路平衡查找树

      BTree示意图
      在这里插入图片描述
      BTree图解析

      1)每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址
      2)两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35

      查找过程 查找数据项29

      1)第一次IO,先把磁盘块1由磁盘加载到内存,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计
      2)第二次IO,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,29在26和30之间,锁定磁盘块3的P2指针,
      3)第三次IO,通过指针加载磁盘块8到内存,同时内存中做二分查找找到29,结束查询

      BTree缺点

      1)每个节点中有key、指针和data,而每一个页的存储空间是有限的,如果data数据较大时就会导致每个节点(即一个页)能存储的key的数量很小

      2)当存储的数据量很大时,同样会导致B-Tree的深度较大,增加查询时的磁盘I/O次数,进而影响查询效率

    • B+Tree B+Tree是在BTree基础上的一种优化,innoDB存储引擎就是用B+Tree实现其索引结构的

      B+Tree和BTree的区别

      1)非叶子节点只存储键值(key)和指针
      2)所有叶子节点间都有链指针
      3)数据记录都放在叶子节点中

      B+Tree示意图

在这里插入图片描述

为什么说B+树比B树更适合实际应用中操作系统的文件索引和数据库索引?

B+Tree的磁盘读写代价更低
B+Tree的内部结点并没有指向关键字具体数据的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了

Mysql的索引实现

  • MyISAM索引实现

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:

在这里插入图片描述

  • InnoDB索引实现

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

在这里插入图片描述

与MyISAM的一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录

  • 小结 MyISAM和InnoDB引擎的区别

    MyISAM存储引擎B+tree的叶子节点中data不是数据本身,而是数据存放的地址,主索引和辅助索引没什么区别,只是主索引是唯一的,这里的主索引和辅助索引都是非聚簇索引。myisam引擎的索引文件和数据文件是独立分开的

    InnoDB存储引擎B+tree中叶子节点中data存储的是数据本身,key为主键,这是聚簇索引。在innodb中,即存储主键索引值,又存储行数据


MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值