Mysql-索引

文章目录

  • 索引实现原理
  • 最左匹配原则
  • Explain重要字段
  • 索引类型
  • 数据库的NULL存储
  • 索引下推
  • filesort原理
  • 参考

索引实现原理

MySQL索引实现解析

最左匹配原则

MySQL索引最左匹配原则是什么
创建一个表格

CREATE TABLE `test` (  `a` int NOT NULL AUTO_INCREMENT,  
`b` int DEFAULT NULL,  
`c` int DEFAULT NULL,  
`d` int DEFAULT NULL,  
`e` int DEFAULT NULL,  
PRIMARY KEY(`a`),  
KEY `idx_abc` (`b`,`c`,`d`)) 
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;  
INSERT INTO test(`a`, `b`, `c`, `d`, `e`) VALUES (1, 2, 3, 4, 5);
INSERT INTO test(`a`, `b`, `c`, `d`, `e`) VALUES (2, 2, 3, 4, 5);
INSERT INTO test(`a`, `b`, `c`, `d`, `e`) VALUES (3, 2, 3, 4, 5);

索引下推 (Using index condition)

mysql> explain SELECT * from test where b >1 and c = 1;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | test  | NULL       | range | idx_abc       | idx_abc | 5       | NULL |    2 |    33.33 | Using index condition |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

索引覆盖 (Using index)

mysql> explain SELECT b, c, d FROM test WHERE d = 2;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | test  | NULL       | index | idx_abc       | idx_abc | 15      | NULL |    3 |    33.33 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

走联合索引

mysql> explain SELECT * FROM test where b = 2;
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | test  | NULL       | ref  | idx_abc       | idx_abc | 5       | const |    3 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

走主键索引

mysql> explain SELECT * FROM test whtest where a = 2;
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | whtest | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

不走索引

mysql> explain SELECT * FROM test where c = 2;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

Explain重要字段

  • possible_keys:可能选择的索引
  • key:实际选择的索引
  • type: 链接类型,性能从好到坏:system > const > ref > index > all
    • system和const都是查询结果只有一行记录,sytem是特殊的join,查的是系统表。一般是主键索引或者唯一索引;
    • ref:当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。走普通索引
    • index: 全表查询索引表
    • all:全表查询
  • rows: MySQL估算会扫描的行数,数值越小越好。
  • Extra: 展示有关本次查询的附加信息
    • Using index: The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row. This strategy can be used when the query uses only columns that are part of a single index.
    • Using index condition:Tables are read by accessing index tuples and testing them first to determine whether to read full table rows. In this way, index information is used to defer (“push down”) reading full table rows unless it is necessary.
    • Using where: 不管有没有通过索引查找,只要加载了数据到内存进行where条件筛选。

索引类型

  • Primary Key(主键)(聚簇索引):包含全量数据集
  • 普通索引
  • 唯一索引:索引列的值必须唯一,但允许有多个空值。若是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值
  • 组合索引
  • 全文索引:聊一聊MySQL的全文检索
  • 短索引(前缀索引)
    • 创建前缀索引
    CREATE TABLE test.t1 (
    col1 VARCHAR(10),
    col2 VARCHAR(20),
    INDEX (col1, col2(10))
    );
    
  • 倒排索引: “关键词” => “文档ID”,即关键词到文档id的映射

数据库的NULL存储

  • MySQL 的 NULL 值是怎么存储的?
  • mysql 是怎么在磁盘上是存储 NULL 的?

索引下推

五分钟搞懂MySQL索引下推

filesort原理

order by 出现 using filesort根因分析及优化

  • 双路排序:
    读取行指针(即rowid)和order by列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。
    双路排序的开销可能会非常巨大,因为他会读取表两次,第二次读取会引发大量的随机IO,对于myisam涞说,这个代价尤其昂贵,myisam表利用系统调用去提取每行的数据。
  • 单路排序:
    读取查询需要的所有列,按照order by 列对他们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。

如果需要排序的列的总大小加上order by列的大小超过了 max_length_for_sort_data定义的字节,mysql就会使用双路排序,当任何需要的列(甚至不是用来order by的列)是text.blob的时候,也会使用双路排序,(可以使用substtring() 把这些列转化为可以单路排序的列)。

参考

  • EXPLAIN Output Format
  • explain-extra-information

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构,线性表有哪些

线性表是一种常见的数据结构,它的特点是数据元素之间存在一对一的线性关系。根据线性表的存储方式和实现方式,线性表主要有以下几种: 1. 顺序表(Sequential List): - 通常使用数组实现。 - 元素在内存中是连续…

VR智慧校园资中控管理平台综合提升了课堂教学质量

随着越来越多高校在课堂中引进VR虚拟仿真实训系统,为了方便老师对全班同学进行高效率地管理,VR中控平台应运而生。下面为您详细介绍VR中控平台在课堂教学中的应用优势。 VR中控系统安装在教师总控端,融合了课件、视频、3D动画等丰富的教学资源…

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 😊 代码仓库分享 💕 前言: 今天我们来回顾一下顺序表与链表,针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习,这样才能巩固我们学习的内容。 话不多说&#xf…

c++ 中new的用法

当你使用 C 中的 new 操作符时,你实际上在堆内存中分配了一块空间,用于存储一个或多个对象。这与栈内存不同,栈内存的分配和释放是自动管理的,而堆内存需要手动管理。下面我将详细解释如何使用 new 操作符来创建单个对象和对象数组…

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)效…

安防监控视频平台EasyCVR视频汇聚平台和税务可视化综合管理应用方案

一、方案概述 为了确保税务执法的规范性和高效性,国家税务总局要求全面推行税务系统的行政执法公示制度、执法全过程记录制度和重大执法决定法制审核制度。为此,需要全面推行执法全过程记录制度,并推进信息化建设,实现执法全过程的…

HAproxy+keepalived高可用配置搭建

目录 一、概述 (一)简介 (二)核心功能 (三)关键特性 (四)应用场景 二、安装 1)拓补图 2)配置 (一)内核配置 (二…

几种在JavaScript中创建对象的方式!

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字面量方式⭐ 构造函数方式⭐ Object.create()方式⭐ 工厂函数方式⭐ ES6类方式⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门…

【硬件设计】硬件学习笔记一--元器件的介绍与选型

硬件学习笔记一--元器件的选型 一、电阻1.1 电阻的分类1.2 电阻的选型 二、电容2.1 陶瓷电容2.2 钽电容2.3 铝电解电容2.4 电容选型 三、电感3.1 定义与介绍3.2 电感的分类3.3 电感的参数 四、磁珠4.1 磁珠的介绍4.2 磁珠的参数 五、二极管5.1 定义5.2 稳压管5.3 肖特基二极管5…

究竟会不会阻塞?HTML文档渲染中的CSS和JS文件下载探秘

在Web前端开发中,网页的性能优化一直是一个重要的课题。其中,优化网页的加载速度尤为关键。本文将探讨一个常见的问题:HTML文档渲染过程中,CSS文件和JS文件的下载是否会阻塞渲染,以及如何处理这个问题。 阻塞渲染的问…

SystemVerilog Chapter24: Programs

24.1General概述 本条款描述了以下内容: --Programs 声明 --Programs 调度语义 --与时钟块结合使用的Programs --匿名Programs 24.2 Overview module是设计的基本构建块。module可以包含其他模块、网络、变量、子例程声明以及a…

BDA初级分析——可视化基础

一、可视化的作用 数据可视化——利用各种图形方式更加直观地呈现数据的过程 可视化的作用 1、更快地理解数据,找出数据的规律和异常 2、讲出数据背后的故事,辅助做出业务决策 3、给非专业人士提供数据探索的能力 数据分析问题如何通过可视化呈现&am…

数据分析基础-数据可视化02-不同数据类型的可视化概念及原则

将数据空间映射到颜色空间。 数据空间:连续或分类 数据可以被划分为两个主要的数据空间:连续数据和分类数据。这两种数据空间有不同的特点和适用的分析方法。 连续数据(Continuous Data): 连续数据是指可以在某个范…

Orchestrator介绍二 自身高可用性方案

目录 获得 HA 的方法 一 没有高可用性 (No high availability) 使用场景 架构组成 架构图 二 半高可用性(Semi HA) 三 基于共享数据库后端高可用(HA via shared backend) 四 基于Raft协议高可用 五…

webrtc交叉编译嵌入式的方法

背景是我们有嵌入式的需求,需要编译webrtc进入板子上。先说结论,最后是这样config之后就编译通过的: gn gen out/linux-yeshen --args‘target_os“linux” target_cpu“arm64” ffmpeg_branding“Chrome” proprietary_codecstrue is_debugt…

Tableau可视化入门实践-2

目录 折线图1.导入excel文件数据2.建立折线图并添加标签 双轴折线图 折线图 1.导入excel文件数据 2.建立折线图并添加标签 双轴折线图 行标签拖进两个度量建立上下两个折线图 在第二个折线图纵轴,右键选择“双轴”

【mysql】MySQL服务无法启动 NET HELPMSG 3534

MySQL服务无法启动 NET HELPMSG 3534 错误描述寻找原因解决方法 错误描述 mysql版本:8.1.0 mysql安装成功之后,使用net start mysql来启动mysql,然后出现了报错 MySQL服务无法启动 NET HELPMSG 3534 寻找原因 1、在cmd中,进入…

JWT-Token

一、JWT 需要在 HTTP 这种无状态的机制下,记录下(标识)出来是不是连续(逻辑上的连续)的请求。 思路:如果多次请求,携带了相同的标识型数据,则认为是逻辑上连续的。这个标识&#xff…

数据结构(Java实现)LinkedList与链表(下)

** ** 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下: 也…

构建 NodeJS 影院预订微服务并使用 docker 部署(04/4)

一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 我们前几章的快速回顾 第一篇文章介绍了微服务架构模式,并讨论了使用微服务的优缺点。第二篇…