62 mysql 中 存储引擎MyISAM 中索引的使用

前言

固定数据表

mysql. tables_priv 的表结构创建如下 

CREATE TABLE `tables_priv` (`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',`User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',`Grantor` char(93) COLLATE utf8_bin NOT NULL DEFAULT '',`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'

 

 

基于 固定长度MyISAM 的数据表的索引的使用

这里 是按照 B+ 树来存储的索引 

然后我们这里 来看一下 一个具体的索引的使用方式

假设执行 sql 如下 “select * from `tables_priv` where Host = '%';”

如下图, 在 sub_select 中的处理是在 qep_tab->read_first_record 的处理, 就是根据查询条件 “Host = '%';” 的条件的定位 

5bdbab8040cb4498929453a370a08799.png

 

然后具体到索引的存储方式, 这里 tables_priv 是以 BTREE 的方式进行存储的 

然后下面的 (*info->read_record(info, info->lastpos, buf)) 是根据记录的位置, 读取具体的数据信息到 buf 中 

b868617f3e90b8717539f5d3617f74e7.png

 

然后这里是具体的 根据索引进行查询的方式, keyinfo->bin_search 是具体的查询方式 

然后下面 info->lastpos 以及相关代码是从 索引信息中获取上下文需要的数据

info->lastpos 表示的是查询目标记录的 偏移, 比如这里的 ” %@test_03@tz_test@tz_test” 记录对应的是第三条数据, 偏移为 947 * 2 = 1894

keyinfo 表示的是使用的索引的信息, 这里可以看到的是有四个字段, keyinfo->seg 开始为索引的每一个字段的信息 

ae8c5832eb9bc2c436655239aacdd8ac.png

 

然后接着是 获取到偏移之后, 具体的数据的读取, 这部分在上面的流程中对应于 (*info->read_record(info, info->lastpos, buf))

然后 这里的具体的通过 偏移读取记录数据的具体实现

dfdceb6be9ccc28df23c1139fd832d02.png

 

然后 这是读取了第一条数据, 接下来是 查询索引获取下一条符合条件的数据 

a5dd6b987ab9eb22d76ad1d5b1d2f8b2.png 

mi_search_next 查询下一个符合条件的记录之后, 下面 ha_key_cmp 比较目标索引, 待查询条件 

我们这里的情况是 匹配不上, 然后响应 HA_ERR_END_OF_FILE 给上层, 然后 再上面 sub_select 跳出循环 

下面的 (*info->read_record(info, info->lastpos, buf)) 为匹配成功之后, 读取下一条记录的处理 

b23234c188f6b6453505451854ebc715.png

 

 

基于 固定长度MyISAM 的数据表的索引的查询方式  

具体的查询方式, 这里的标准如下 

如果索引有压缩的数据, 只能使用 顺序查询 mi_seq_search

如果索引是有变长的字段, 查询方式为 顺序查询 mi_seq_search 或者 前缀查询 mi_prefix_search

如果是固定长度的数据, 并且没有压缩, 使用 二分查找 mi_bin_search

我这里 tables_priv 的查询方式为顺序查询 mi_seq_search

c140530d1770a41c969bf365ff3a5e7f.png

 

我们这里主要是 看一下 顺序查询 mi_seq_search 和 二分查找 mi_bin_search

 

 

顺序查询 mi_seq_search

这个是先很简单, 就是从一个索引开始, 向下顺序查询 

这里 (*keyinfo->getkey(keyinfo, nod_flag, &page, t_buf)) 为查询当前索引的 key 相关信息, 然后 并更新 page 的位置到下一个索引

然后 接下来就是 ha_key_cmp 来进行索引 和查询条件的比较, 如果比较成功, 则 break 出去

否则 继续顺序向下面迭代

6250af1221daeceebbe406c025853f48.png

 

 

二分查询 mi_bin_search  

这个就是一个很简单的 二分查询, 这里不多说 

570b69fe9bf48006e5da4e18f74c9448.png

 

 

基于 固定长度MyISAM 的数据表的索引的存储方式  

在 MyISAM 中, 无论是主键索引, 还是其他普通索引, 均是采用 非聚簇索引的方式进行存储的, 因为在 MyISAM 中该记录的偏移实际上是 我们常规理解的索引, 因此 索引值存放的是能够直接 或者 间接推导出该偏移的数据

比如我们这里 “%@test_03@tz_test@tz_test” 的索引记录如下 

其前面这部分存储的是 四个 key, 然后 数据值存储的是 0x02, 是该记录的 索引, 表示该记录是 目标表的第三条数据

d97ccd36654f9bef5d0e0a3ede060869.png

 

然后这里是读取索引记录, 获取索引的偏移 

这里读取到的 索引值为 0x02, 表示该记录是 目标表的第三条记录

然后 乘以 info->s->base.pack_reclength 为该记录的偏移, 然后之后 基于该偏移 来获取数据

b16de26be8c183f4a4c79e4b2ffe2e63.png

 

 

基于 动态长度的MyISAM 的数据表的索引的存储方式  

mysql.user 创表语句如下, 可以看到 索引是 “Host@User“

CREATE TABLE `user` (`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',`Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',`ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',`ssl_cipher` blob NOT NULL,`x509_issuer` blob NOT NULL,`x509_subject` blob NOT NULL,`max_questions` int(11) unsigned NOT NULL DEFAULT '0',`max_updates` int(11) unsigned NOT NULL DEFAULT '0',`max_connections` int(11) unsigned NOT NULL DEFAULT '0',`max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',`plugin` char(64) COLLATE utf8_bin DEFAULT '',`authentication_string` text COLLATE utf8_bin,`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'

  

索引记录拆解如下, “%@tz_test” 是索引的 key

然后 具体存放的数值为 0x0184, 对应于偏移 388

d3767ee3e49843ccc4cab0e9c482e5dc.png

 

然后 读取偏移的时候如下, 

072d82921762a5c66dccba1d21b96122.png

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3912.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用buildx构建多架构平台镜像

1. 查看buildx插件信息 比较新的docker-ce版本默认已经集成了buildx插件 [rootdocker ~]# docker buildx version github.com/docker/buildx v0.11.2 9872040 [rootdocker ~]#2. 增加多平台镜像构建支持 通过tonistiigi/binfmt:latest初始化一个基于容器的构建环境&#xff…

数据库基础(3) . Navicat使用

0.下载安装 官网 : https://www.navicat.com.cn/ Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理 1.连接数据库 1.1.连接 1.1.1.点击连接 打开navicat 点击 左上角连接 1.1.2.选择MySQL 弹出配置界面 1.1…

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说&a…

国密SM2 非对称加解密前后端工具

1.依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpki…

【银河麒麟操作系统】软raid重建速度限制问题分析

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 遇到软raid重建速度问题&#xff0c;分…

ssm教室信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 …

去中心化存储:Web3中的数据安全新标准

随着Web3的兴起&#xff0c;去中心化存储逐渐成为数据安全的新标准。传统的中心化存储方式将数据集中保存在少数服务器上&#xff0c;这种模式尽管在早期互联网中被广泛应用&#xff0c;但随着数据量和数据价值的增加&#xff0c;其潜在的安全风险和隐私问题也逐渐暴露。而去中…

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境&#xff0c;所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后&#xff0c;可以通过 sudo update-alter…

安卓摄像头的详细使用

安卓摄像头的详细使用 一、引言二、权限设置三、打开摄像头四、摄像头的属性设置&#xff08;一&#xff09;预览尺寸&#xff08;二&#xff09;图片格式&#xff08;三&#xff09;对焦模式 五、摄像头预览六、拍照功能七、视频录制 一、引言 在安卓开发中&#xff0c;摄像头…

服务器的配置复杂,租用时该如何选择参数?

对于互联网企业来说&#xff0c;开发一套可以接入互联网的产品&#xff0c;并利用它来盈利是终极目的。但互联网产品必须有服务器才能运行&#xff0c;对于很多公司来说&#xff0c;托管服务器成本太高&#xff0c;而租用服务器才算得上是最好的选择&#xff0c;但面对配置参数…

10min本地安装Qwen1.5-0.5B-Chat

大模型系列文章 本地电脑离线部署大模型 配置&#xff1a;MAC-M1-8GB 10min本地安装Qwen1.5-0.5B-Chat 大模型系列文章前言一、下载Qwen1.5-0.5B-Chat二、构造函数chatBot.py三、启动命令1、放置脚本2、启动命令3、效果图 前言 在人工智能领域&#xff0c;大模型无疑是最炙手…

90%会展主办方都会用的6款数字化工具

在会展行业&#xff0c;数字化转型已成为提升竞争力的关键。面对日益增长的运营成本和收入增长的瓶颈&#xff0c;主办方需要借助数字化工具来实现效率提升和成本控制。 今天介绍几种常见的数字化工具和应用方式。 一、线上展览平台 构建线上展览平台是会展主办方拓展线上销…

弃用 RestTemplate,来了解一下官方推荐的 WebClient !

在 Spring Framework 5.0 及更高版本中&#xff0c;RestTemplate 已被弃用&#xff0c;取而代之的是较新的 WebClient。这意味着虽然 RestTemplate 仍然可用&#xff0c;但鼓励 Spring 开发人员迁移到新项目的 WebClient。 WebClient 优于 RestTemplate 的原因有几个&#xff…

SpringBoot+Thymeleaf电商系统

> 这是一个基于SpringBootThymeleafBootstrap实现的简单电商系统。 > 实现了用户浏览、添加购物车、商品管理等功能&#xff0c;并支持响应式布局。 > 本项目适合JAVA初学者作为入门学习项目 一、部分界面演示 二、技术栈 技术栈中文描述Spring Boot快速开发框架…

02-Dubbo特性及工作原理

02-Dubbo特性及工作原理 Dubbo 的特性 这里说一下 Dubbo 最主要的特性&#xff0c;从这些特性中&#xff0c;就可以看出来我们为什么要选用 Dubbo&#xff0c;也可以将 Dubbo 和 Spring Cloud 进行对比&#xff0c;比如我们搭建一套微服务系统&#xff0c;出于什么考虑选用 Dub…

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N 2024/11/2 18:04 在WIN10使用程序&#xff1a;ViewLink-4.0.7_0708-windows-x64.exe 在荣品PRO-RK3566开发板的预置Android13下使用&#xff1a;ViewLink-2023_12_21-release-0.2.6.apk adb install…

Oracle OCP认证考试考点详解082系列12

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 56. 第56题&#xff1a; 题目 解析及答案&#xff1a; 关于企业管理器&#xff08;EM&#xff09;Express&#xff0c;以下哪两个陈述是…

AutoCAD2020

链接: https://pan.baidu.com/s/1Gvp3lQtMJxP0e_Fs5E_kIg提取码: jvuf 简介&#xff1a;一键安装&#xff0c;已经破解。支持W7-w10-w11系统64位

源鲁杯 2024 web(部分)

[Round 1] Disal F12查看: f1ag_is_here.php 又F12可以发现图片提到了robots 访问robots.txt 得到flag.php<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[b];if($a>99999…

《高频电子线路》—— 调频方法

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 目录 调频方法 分类 调频技术指标 小结 直接调频方法与电路 直接调频方法 变容二极管直接调频电路 优缺点以及提升稳定性的方法…