0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL索引的常用知识点

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-30 16:43 次阅读

索引结构:B+树

索引其实是一种数据结构

注意B+树是MySQL,索引默认的结构;一张表至少有一个索引(主键索引),是可以有多个索引的

MySQL中的B+Tree

  1. 非叶子节点也叫内部节点,只存储 健值(主键的值) + 指针(存储子节点的地址信息
    • 主键索引:健值(主键的值) + 指针(存储子节点的地址信息)
    • 非主键索引:非主键列的值 + 指向下一个节点的指针(存储子节点的地址信息)
  2. 所有的数据都存在叶子节点中;
    • 同时叶子节点上还存有一个指向相邻叶子节点的指针
    • 如果是聚簇索引(主键索引),叶子节点存储的是实际数据
    • 如果是非聚簇索引,则保存的是聚簇索引的索引key,也就是主键索引的值;查询非聚簇索引会有一个回表操作
  3. B+Tree的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构。

为什么B+ 树比B 树更适合作为索引?

  1. B+ 树的磁盘读写代价更低 B+ 树的数据都集中在叶子节点,分支节点 只负责指针(索引);B 树的分支节点既有指针也有数据 。这将导致B+ 树的层高会小于B 树的层高,也就是说B+ 树平均的Io次数会小于B 树。
  2. B+ 树的查询效率更加稳定 B+ 树的数据都存放在叶子节点,故任何关键字的查找必须走一条从根节点到叶子节点的路径。所有关键字的查询路径相同,每个数据查询效率相当。
  3. B+树更便于遍历 由于B+树的数据都存储在叶子结点中,分支结点均为索引,遍历只需要扫描一遍叶子节点即可;B树因为其分支结点同样存储着数据,要找到具体的数据,需要进行一次中序遍历按序来搜索。
  4. B+树更擅长范围查询 B+树叶子节点存放数据,数据是按顺序放置的双向链表。B树范围查询只能中序遍历。
  5. B+ 树占用内存空间小 B+ 树索引节点没有数据,比较小。在内存有限的情况下,相比于B树索引可以加载更多B+ 树索引。

MyISAM与InnoDB 的区别

  1. InnoDB支持事务,MyISAM不支持

  2. InnoDB支持外键,而MyISAM不支持

  3. InnoDB是聚集索引,数据和索引存到同一个文件里;MyISAM是非聚集索引,数据和索引不在同一个文件里;都是使用B+Tree作为索引结构

  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)

    因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。InnoDB会尝试遍历一个尽可能小的索引除非优化器提示使用别的索引。如果二级索引不存在,InnoDB还会尝试去遍历其他聚簇索引。

    如果索引并没有完全处于InnoDB维护的缓冲区(Buffer Pool)中,count操作会比较费时。可以建立一个记录总行数的表并让你的程序在INSERT/DELETE时更新对应的数据。和上面提到的问题一样,如果此时存在多个事务的话这种方案也不太好用。如果得到大致的行数值已经足够满足需求可以尝试SHOW TABLE STATUS

    • 那么为什么InnoDB没有了这个变量呢?
  5. InnoDB支持表、行(默认)级锁,而MyISAM仅支持表级锁

  6. InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有主键

  7. Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI

    • Innodb:frm是表定义文件,ibd是数据文件
    • Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

索引失效的场景

  1. 对索引列使用了函数、表达式或运算符:当查询条件中使用了函数、表达式或运算符时,MySQL就无法使用该列的索引,因为它需要对每行数据进行计算,而不是直接查找索引。
  2. 查询条件中使用了不等于操作符(<>、!=)、NOT NULL, NOT IN 等
  3. 模糊查询:当查询条件中使用了LIKE、%或_等模糊匹配符号时,MySQL无法使用索引进行快速定位。
  4. OR条件:当查询条件中包含多个OR条件时,MySQL无法使用索引进行快速定位。
  5. 范围查询:当查询条件中使用了BETWEEN、<、>、<=、>=等操作符时,MySQL只能使用索引中的一部分数据,需要读取更多的数据进行过滤,降低了查询效率。
  6. 数据类型不匹配,需要隐式转换类型
  7. 对索引列进行排序,因为它需要将数据按照指定的顺序进行排序
  8. 复合索引,如果不使用前列,后续列也将无法使用

小结

正确的使用索引,能够显著提高数据库的查询效率。本文汇总了MySQL索引的常用知识点,帮助大家快速记忆

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 缓冲
    +关注

    关注

    0

    文章

    51

    浏览量

    17810
  • 指针
    +关注

    关注

    1

    文章

    479

    浏览量

    70507
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40090
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26437
收藏 人收藏

    评论

    相关推荐

    Jackson常用知识点和易错

    Jackson常用知识点和易错
    发表于 06-12 17:22

    电机选型设计的常用公式与知识点

    电机选型设计的常用公式与知识点汇总
    发表于 01-27 06:46

    linux常用的命令知识点

    Linux基础命令的总结linux常用的命令知识点
    发表于 02-02 06:31

    STM32外部中断知识点概述

    STM32外部中断概述知识点(1)知识点(2)知识点(3)中断服务函数外部中断常用库函数外部中断的一般配置步骤知识点(1)STM32的每个I
    发表于 08-16 07:43

    高一数学知识点总结

    高一数学知识点总结高一数学知识点总结高一数学知识点总结
    发表于 02-23 15:27 0次下载

    高二数学知识点总结

    高二数学知识点总结高二数学知识点总结高二数学知识点总结
    发表于 02-23 15:27 0次下载

    PWM知识点详解

    PWM知识点
    发表于 03-16 08:00 44次下载

    MySQL索引的使用问题

    MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢?3、MySQL 到底在怎么样的情况下能够利用索引进行排序?今天,我将会用一个模型,把这些问题都一一解答,让你对
    的头像 发表于 01-06 16:13 1584次阅读

    MySQL的基本知识点梳理和常用操作总结

    本文主要是总结了工作中一些常用的操作,以及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有mysql基础的开发人员。 一、索引相关 1、索引基数:基数是数据列所
    的头像 发表于 02-04 13:44 1700次阅读
    <b class='flag-5'>MySQL</b>的基本<b class='flag-5'>知识点</b>梳理和<b class='flag-5'>常用</b>操作总结

    嵌入式知识点总结

    嵌入式知识点总结(arm嵌入式开发led过程)-嵌入式知识点总结                    
    发表于 07-30 14:20 23次下载
    嵌入式<b class='flag-5'>知识点</b>总结

    电力基础知识点合集

    电力基础知识点合集
    发表于 03-14 16:35 0次下载

    MySQL索引下推知识分享

    Mysql 是大家最常用的数据库,下面为大家带来 mysql 索引下推知识点的分享,以便巩固 mysql 基础
    的头像 发表于 12-27 09:49 628次阅读

    数字电路知识点总结

    本文整理了数字电路课程中的相关基本的知识点和较为重要的知识点,用于求职的数电部分的知识准备,差缺补漏。
    的头像 发表于 05-30 15:07 4691次阅读
    数字电路<b class='flag-5'>知识点</b>总结

    MySQL高级进阶:索引优化

    MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。
    的头像 发表于 06-11 11:13 551次阅读
    <b class='flag-5'>MySQL</b>高级进阶:<b class='flag-5'>索引</b>优化

    MySQL知识点汇总

    大家好,这部分被称为DQL部分,是每个学习MySQL必须要学会的部分,下面就让我来介绍MySQL中的其他部分。
    的头像 发表于 08-05 15:27 366次阅读
    <b class='flag-5'>MySQL</b><b class='flag-5'>知识点</b>汇总