广告
返回顶部
首页 > 资讯 > 数据库 >MySQL性能优化1-MySQL底层索引结构
  • 551
分享到

MySQL性能优化1-MySQL底层索引结构

mysql性能优化数据库 2023-08-23 23:08:30 551人浏览 独家记忆
摘要

❤️ 个人主页:程序员句号 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬+关注 🌸 订阅专栏:Mysql性能调优 mysql性能优化专栏 1.MySQL性能优化1-MyS

❤️ 个人主页:程序员句号
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬+关注
🌸 订阅专栏:Mysql性能调优

mysql性能优化专栏
1.MySQL性能优化1-MySQL底层索引结构
2.MySQL2-Explain详解
3.MySQL3-索引最佳实战
4.MySQL4-MySQL内部组件结构
5.MySQL5-事务隔离级别和锁机制
6.MySQL6-深入理解MVCC和BufferPool缓存机制

深入理解Mysql底层索引结构与算法

什么是索引?

一句话解释:索引是帮助MySQL高效获取数据的排好序的数据结构
我们都知道MySQL底层使用的是B+Tree树,那为什么要使用B+Tree树勒?有哪些数据结构可以使用?

索引数据结构的选择

不了解数据结构也没关系,记住就行,后面去理解下各种数据结构就好。
这四种我们都没有使用,为什么不使用?

  • 二叉树

    这是因为如果我们的主键是自增的,那么所形成的二叉树就跟链表一样了,链表的缺点大家都知道,插入快,查询慢。

  • 红黑树
    红黑树是对二叉树的一个升级,可以解决上面那个问题,但如果数据量巨大,那么它的高度是非常高的,那么也会导致查询慢。

  • Hash表
    Hash表单纯来说,查找的时候都比B+Tree树快,因为只需要计算一次hash就可以找到数据。但它不支持范围查询之类的复杂查询,如果需要范围查找,那么就得全表扫描了。

  • B-Tree
    这个结构解决红黑树的问题,但不完全解决,因为它是相当于开了一个多叉树,也就是一个节点可以存储多个节点,因为它设置了根节点的大小为16KB。但B-Tree结构是非叶子节点不会存储数据,所以高度对于B+Tree树还是比较高。

为什么MySQL选择B+Tree,不选择B-Tree?

主要因为两个原因:

  1. 同样的数据量B+Tree树的高度小于B-Tree的高度,因为B-Tree非叶子节点也会存储数据,而MySQL设置的一个高度数据大小是16KB。所以每个节点的数据大小越大,每个高度能存储的节点就越少,那么能存储的节点数量也就越少
  2. 加载到内存中,费内存

什么是聚集(聚簇)索引,什么是非聚集索引?

我们常用的InnoDB存储结构就是使用的聚集索引,而非聚集索引就是MyISAM。
聚集索引:叶子节点包含了完整的数据记录(也就是数据和索引没有分开)。
非聚集索引:MyISAM索引文件和数据就是分离的。

在window下安装mysql,然后建一个test表,找到mysql安装目录下的data目录,再找到对应的数据库目录,打开后可以看到下方的文件。

InnoDB存储结构

  1. frm:表结构
  2. .ibd:索引加数据
    在这里插入图片描述

MyISAM存储结构

  1. 【frm后缀】:表结构
  2. .【MYD后缀】:数据
  3. 【MYI后缀】:索引文件

在这里插入图片描述

什么是主键索引和非主键索引?

主键索引:每张表都有主键,你设置的主键会默认生成一个索引,该索引就叫主键索引。
非主键索引:除主键索引外,设置的其他索引如单一索引,联合索引都是非主键索引。

两者区别:主键索引的叶子节点是存储的完整数据,而非主键索引叶子节点是存储的主键id,所以就有个回表操作。SQL命中了非主键索引,非主键索引还需要进行一次回表操作

什么是覆盖索引?

 覆盖索引算不上真正的索引,它意思是查询的结构集在我们的索引中,就不需要进行回表操作。MySQL执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结构只通过辅助索引就能拿到结构,不需要通过辅助所以树找到主键,再通过主键去主键索引树里获取其他字段值。

为什么建议InnoDB表必须建主键?并且推荐使用整型的自增主键?

 因为和Innodb的存储结构相关的,Innodb的索引和数据是在一起的,所以它肯定会由一列组成B+Tree,如果你没有建索引,首先MySQL会先从表里找一列全是数字不重复的列作为索引,如果没找到,会创建一个虚拟的索引rowId,所以这就是有啥建议有主键的原因。

第二个问题:为什么推荐使用整型的?
  我们观察索引查找的过程,会发现每次都在做比较把,那什么样的数据比较最快勒,那肯定是整型咯,如果是uuid,还得转成Aisll码去一个一个的比较。

第三个问题:为什么推荐使用自增主键?
  因为如果是有序的,那么就会减少B+Tree树的分裂和平衡。
  如下图这时候插入7,可能会造成节点的分裂和平衡。因为我们知道叶子叶子的排列是排好序的,7在6和8之间,而刚好节点数量又达到了阈值,所以会分裂和平衡。
(这里是使用了数据结构可视化网址
在这里插入图片描述

为什么非主键索引结构叶子存储的是主键值?(InnoDB)

  因为一致性和节省存储空间,如果每开一个索引就要维护一份数据,那它浪费空间了。并且你做更新删除等操作时也需要同时删除几个索引下的数据。会产生回表操作(也就是查聚集索引的那个数据结构)

联合索引的底层数据结构是怎么样的?

分为联合主键和联合索引。
也是一颗B+Tree,但是它会排序,先比较name,再比较age,再比较position来决定先后顺序。
在这里插入图片描述

最左前缀原理是什么?为什么有这个最左前缀?

前提你创建了联合索引,你想要使用到索引,必须先使用最左边的那个字段,否则你是使用不了索引的。

EXPLAIN SELECT * FROM test_innodb WHERE name = 'Bill' and age = 31; 走索引EXPLAIN SELECT * FROM test_innodb WHERE age = 30 AND position = 'dev'; 不走EXPLAIN SELECT* FROM test_innodb WHERE position = 'manager'; 不走EXPLAIN SELECT* FROM test_innodb WHERE name = 'Bill' and position = 'manager'; 走索引EXPLAIN SELECT* FROM test_innodb WHERE name = 'Bill' and position < 'manager' and position > 'dev';EXPLAIN SELECT * FROM test_innodb WHERE age = 30 AND name = 'dev';  走索引(因为Mysql的自动优化)

第二个问题:因为它的底层数据结构就是先根据字段前后去排序组成的二叉树,如果第一个没得,那么后面的字段你去查找会发现不是顺序的,那么你就只能去全表扫描了。
例如上图:如果不用name字段,那么age单独是没得顺序的,你根据age去查找肯定是得全表扫描的。想要age字段有序,之前的索引字段name必须是相等的

来源地址:https://blog.csdn.net/2301_76921448/article/details/129632825

您可能感兴趣的文档:

--结束END--

本文标题: MySQL性能优化1-MySQL底层索引结构

本文链接: https://www.lsjlt.com/news/378917.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL性能优化1-MySQL底层索引结构
    ❤️ 个人主页:程序员句号 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬+关注 🌸 订阅专栏:MySQL性能调优 MySQL性能优化专栏 1.MySQL性能优化1-MyS...
    99+
    2023-08-23
    mysql 性能优化 数据库
  • MySQL索引底层数据结构详情
    目录一、索引类型 1.B+树 2.MyISAM和InnoDB的B+树索引实现方式的区别(聚簇索引和非聚簇索引)?3.非聚簇索引 4.聚簇索引的优缺点5.哈希索引 6.自适应哈希索引 ...
    99+
    2022-11-12
  • MySQL索引底层数据结构是什么
    本篇文章为大家展示了MySQL索引底层数据结构是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  案例:  CREATE TABLE `employees` (...
    99+
    2022-10-18
  • MySQL索引底层数据结构怎么理解
    这篇文章主要介绍“MySQL索引底层数据结构怎么理解”,在日常操作中,相信很多人在MySQL索引底层数据结构怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL索引底层数据结构怎么理解”的疑惑有所...
    99+
    2023-06-25
  • Mysql索引底层及优化方法是什么
    今天小编给大家分享一下Mysql索引底层及优化方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2022-10-19
  • MySQL索引优化的性能分析和总结
    本篇内容主要讲解“MySQL索引优化的性能分析和总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL索引优化的性能分析和总结”吧!案例分析我们先简单了解...
    99+
    2022-10-18
  • MySQL数据优化-多层索引
    目录一、多层索引1.创建2.设置索引的名称3.from_arrays( )-from_tuples()4.笛卡儿积方式二、多层索引操作1.Series2.DataFrame3.交换索...
    99+
    2022-11-12
  • MySQL使用索引优化性能
    目录1.索引问题2.索引的存储分类3.如何使用索引3.1使用索引3.2存在索引但不使用索引4.查看索引使用情况5.两个简单实用的优化方法5.1定期分析表和检查表5.2定期优化表1.索...
    99+
    2022-11-13
  • Mysql性能优化之索引下推
    索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索...
    99+
    2022-05-19
    Mysql 索引下推
  • 如何实现MySQL底层优化:数据库分布式架构和性能优化
    抱歉,我无法满足你的要求。...
    99+
    2023-11-08
    性能优化 分布式架构 MySQL优化
  • MySQL 8 新特性之降序索引底层实现
    我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c,d); 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引。 但是大家不知道的是,上面这个sql实际上和下...
    99+
    2018-04-18
    MySQL 8 新特性之降序索引底层实现
  • MySQL查询性能优化索引下推
    目录前言1. 索引下推的作用2. 案例实践3. 索引下推配置4. 索引下推原理剖析5. 索引下推应用范围前言 前面已经讲了mysql的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种方式索引潜水 ...
    99+
    2022-08-16
    MySQL查询性能优化 MySQL索引下推
  • MYSQL性能故障优化利器之索引优化
                     &...
    99+
    2022-10-18
  • 如何实现MySQL底层优化:存储引擎的选择与性能对比
    MySQL 是一种强大的开源关系型数据库,可用于各种规模的应用程序。MySQL 支持多种不同的存储引擎,如 MyISAM、InnoDB、Memory、CSV 等,不同的引擎具有不同的功能和性能特点。在进行 MySQL 底层优化时,存储引擎的...
    99+
    2023-11-09
    优化 存储引擎 编程关键词:mySQL
  • 带你从头到尾捋一遍MySQL索引结构(1)
      前言   Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结。索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家。   这篇博客我会谈谈对于索引结构我自己的看法,以及分享如何从零开始一层一层向...
    99+
    2017-09-18
    带你从头到尾捋一遍MySQL索引结构(1)
  • MySQL性能优化与索引设计的项目经验总结
    MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用和企业级系统中。在开发和维护MySQL数据库时,性能优化和索引设计是非常关键的环节。本文将基于作者在项目中的经验总结MySQL性能优化和索引设计的一些实践方法和技巧。一、了...
    99+
    2023-11-02
    MySQL性能优化 (Performance Optimization) 索引设计 (Index Design) 项目经
  • Mysql性能优化:什么是索引下推?
    导读 本文章始发于本人公众号:码猿技术专栏,原创不易,谢谢关注推荐。 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用...
    99+
    2018-12-31
    Mysql性能优化:什么是索引下推?
  • 怎么进行MySQL性能优化中的索引优化
    本篇文章为大家展示了怎么进行MySQL性能优化中的索引优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引...
    99+
    2022-10-19
  • MySQL高性能索引策略和查询性能优化
    前缀索引和索引选择性 有时候需要索引很长的字符,这会让索引变得大且慢。一个策略是模拟哈希索引。 通常可以索引开始的部分字符,这样可以大大解约索引空间,提高索引效率。但这样会降低索引的选择性。 索引的选择性:不重复的索引值(也成为基数)和...
    99+
    2017-05-17
    MySQL高性能索引策略和查询性能优化
  • MySQL 性能优化小结
    基础概念简述 锁 数据库通过锁机制来解决并发场景 — 共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资源;写锁是排他的,并且会阻塞其他的读锁和写锁。 简单提下乐观锁和悲观锁: 乐观锁:通常用于...
    99+
    2020-11-11
    MySQL 性能优化小结
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作