首页 > 数据库 >mysql的索引

mysql的索引

时间:2022-08-23 17:48:28浏览次数:62  
标签:存储 hash Tree 索引 查找 mysql BTree

索引是什么?

索引是对表中一列或多列数据有序排列的一种数据结构。由此可见,索引是一种有序的数据结构,作用是为了快速定位要查找到数据。

mysql索引采用什么样的数据结构

mysql中索引数据结构有两种,一种是hash索引,一种是BTree。

从mysql的官网可以看到mysql存储引擎对这两种索引的支持情况:

https://dev.mysql.com/doc/refman/5.7/en/create-index.html

 

 

hash索引

hash索引平时使用较少,常用的存储引擎中只有MEMORY Storage Engine显示支持了hash索引。

 

hash索引是将数据的hash值存在一个hash表里(个人理解类似于java中的HashMap),hash表是无序的,这样的数据结构更适用于精确匹配,无法进行范围查找,同时由于hash值是通过数据全部内容计算而来的,因此无法进行部分匹配。但是精确查找的情况下时间效率为O(1),效率是很高的。

BTree索引

BTree是我们工作中最常用到的索引数据结构,BTree的索引数据结构实际上是B+Tree,为什么要采用B+Tree而不是BTree呢?

我们先了解一下BTree和B+Tree的区别

BTree的结构如下图所示:

 

 

 

 由上图可以看出BTree的每个节点都包含索引和数据,索引是有序的。

B+Tree结构如下图所示:

 

 

 

 

 可以看出,B+Tree跟BTree的结构是比较相似的,区别在于:

B+Tree只有叶子节点上存储键值和数据,非叶子节点只存键值,从而在相同空间的情况下每一层的非叶子节点可以存储更多的键值,有效降低树的高度,减少I/O次数,更好的提高查询效率。此外B+Tree的叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

InnoDB存储引擎中默认页的大小为16KB,一般表的主键类型为INT(4个字节)或BIGINT(8个字节),指针类型也一般为4或8个字节,因此一页中可以存储的键值为:16KB/16B,为方便计算,约为1000个,那么三层的B+Tree存储的索引节点可以达到1000*1000*1000个。

Innodb存储引擎设计的索引数据是常驻内存的,通过索引查找数据一般1-3次磁盘I/O即可。

Innodb与Myisam存储引擎对于索引的不同存储方式

myisam数据在计算机上存储的文件如下图

 

 

.frm文件存的表结构,.MYD文件存储的是表数据,.MYI文件存储的是索引,因此Myisam存储引擎中的索引和数据是分开存储的,索引结构B+Tree的叶子节点中存储的是该行数据的磁盘地址。

Innodb在计算机上存储的文件如下:

 

 其中.frm文件存储的是表结构信息,.ibd文件存储的是索引和数据。

在InnoDB中,会根据主键索引的顺序排列数据,没有主键索引会选择一列不重复数据作为主索引,若没有找到不重复数据,InnoDB会创建隐藏列充当主索引,因此建议创建表最好指定主键,主键最好采用int或bigint类型,会有更高效率。

在InnoDB中,创建其他索引的话,索引中存的是主键值,然后根据主键值查找到数据。

组合索引和最左匹配原则

创建组合索引时,数据库底层给组合索引排序时,会先根据第一个字段排序,第一个字段相同的,根据第二个字段排序,以此类推,因此第一个字段在总体上是有序的,后面的字段在前一个字段一样的基础上有序,总体上是无序的,因此当使用where条件查找数据时,直接使用第二个字段作为条件是不会使用到索引的。

标签:存储,hash,Tree,索引,查找,mysql,BTree
From: https://www.cnblogs.com/yashuadiula/p/16616458.html

相关文章

  • Mysql导入数据的时候报错Unknown collation: 'utf8mb4_0900_ai_ci'什么问题?
    最近从线上把数据导出来想搭建到本地的时候报了这么一个错?[ERR]1273-Unknowncollation:'utf8mb4_0900_ai_ci'这个错误究竟是什么原因影响的呢?是因为我们导出数据的......
  • rocky二进制安装mysql8.0
    (ubuntu的有点问题)点击查看代码#!/bin/bashVersion=`cat/etc/os-release|awk-F'"|''/^NAME/{print$2}'`SQLSERVER=mysql-8.0.28-linux-glibc2.12-x86_64.tar.x......
  • Mysql和Redis数据如何保持一致
    先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。关于如何保证Mysql和Redis中的数据一致......
  • mysql大数据表删除优化方案
    先复制这张表,然后在复制表上做删除操作,最后再替换两张表的表名,把复制表表名改为原表名。大量删除数据可能由于一些原因导致失败、死锁、超时。所以把删除的操作放到复制表......
  • MySQL事务MVCC、undolog和redolog
    MySql的MVCC多版本控制undolog:回滚日志(保证一致性)只有在ReadCommited和RepeatableRead隔离级别有用redolog:重写日志(保证持久性)示例讲解 ReadCommited隔离级别(4)se......
  • Django mysql 操作类
    Django-Chain-PyMySQLEasytousePyMySQLindjango.对PyMySQL进行封装,增加链式操作,方便快捷进行CURD操作注:基于Chain-PyMySQL->https://github.com/Tiacx/ch......
  • Flask 学习-12.Flask-SQLAlchemy链接mysql数据库
    前言SQLAlchemy采用简单的Python语言,提供高效和高性能的数据库访问,实现了完整的企业级持久模型。SQLAlchemy是目前python中最强大的ORM框架,功能全面。Flask-SQLAlche......
  • MySQL学习(1)---MySQL概述
    什么是数据库概述数据库(Database)是长期存储在计算机内有组织、大量、共享的数据集合。它可以供各种用户共享,具有最小冗余度和较高的数据独立性。数据库管理系统DBMS(Da......
  • MySQL 临时表的原理以及优化手段
    1临时表sortbuffer、内存临时表和joinbuffer,这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助SQL语句的执行的。其中,在排序的时候用到了sortbuffer,在使用jo......
  • mysql知识总结-连接查询
    Join链接方式Leftjoin左边的表为左表,rightjoin右边的表为右表1、左链接1.1、是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息......