MySQL索引优化

server/2024/10/20 18:53:43/

索引

索引分类:

  • 主键索引
  • 唯一索引
  • 普通索引
  • 组合索引
  • 全文索引

主键索引

非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的 B+ 树包含表数据信息;

PRIMARY KEY(key1, key2);

唯一索引

不可以出现相同的值,可以有 NULL 值;

UNIQUE(key);

普通索引

允许出现相同的索引内容

INDEX(key)
-- OR
KEY(key[,...])

组合索引

对表上的多个列进行索引

INDEX idx(key1, key2[,...]);
UNIQUE(key1, key2[,...]);
PRIMARY KEY(key1, key2[,...]);

全文索引

将存储在数据库当中的整本书和整篇文章中的任意内容信息查找出来的技术;关键词 FULLTEXT
在短字符串中用 LIKE %;在全文索引中用 matchagainst

主键选择

innodb 中表是索引组织表,每张表有且只有一个主键;

  1. 如果显示设置 PRIMARY KEY,则该设置的 key 为代表的主键;
  2. 如果没有显示设置,则从非空唯一索引中选择;
    • 只有一个非空唯一索引,则选择该索引为主键;
    • 有多个非空唯一索引,则选择声明的第一个为主键;
  3. 没有非空唯一索引,则自动生成一个 6 字节的 _rowid 作为主键;

约束

为了实现数据完整性,对于 innodb,提供了以下几种约束:

  • primary key
  • unique key
  • foreign key
  • default
  • not null

外键约束

外键约束用来关联两个表,来保证参照完整性;MyISAM 存储引擎本身不支持外键,只起注释作用;而 innodb 完整支持外键,并且具备事务性;

create table parent (id int not null ,primary key (id)
) engine = innodb;create table child (id int,parent_id int,foreign key (parent_id) references  parent(id) on delete cascade on update cascade
) engine = innodb;insert into parent values (1);
insert into parent values (2);
insert into child values (10, 1);
insert  into child values (20, 2);delete from parent where id = 1;
  • 被引用的表为父表,引用的表为子表;
  • 外键定义时,可以设置行为 ON DELETE 和 ON UPDATE,行为发生时的操作可选择:
    • CASCADE:子表做同样行为
    • SET NULL:更新子表相应的字段为 NULL
    • NO ACTION:父类做相应行为报错
    • RESTRICT:同 NO ACTION

约束和索引的区别

创建主键索引或者唯一索引的时候同时创建了相应的约束;但是约束是逻辑上的概念;索引时一个数据结构即包含逻辑的概念也包含物理存储方式;

索引实现

索引存储

innodb 由段,区,页组成;段分为数据段,索引段,回滚段等;区大小为 1 MB(一个区有 64 个连续页构成);页的默认值为 16 K;页为逻辑页,磁盘物理页大小一般为 4 K 或 8 K;为了保证区中的页的连续,存储引擎一般一次从磁盘中申请 4-5 个区;

image.png

页是 innodb 磁盘管理的最小单位;默认 16 K,可通过 innodb_page_size 参数来修改;
B+树的一个节点的大小就是该页的值;

B+树

  • 全称:多路平衡搜索树,减少磁盘访问次数;用来组织磁盘数据,以页为单位,物理磁盘页一般为 4 K,innodb 默认页大小为 16 K;对页的访问是一次磁盘 IO,缓存中会缓存常访问的页;
  • 特征:非叶子节点只存储索引信息,叶子节点存储具体数据信息;叶子节点之间互相连接,方便范围查询;
  • 每个索引对应一个 B+ 树;

image.png

B+树层高问题

B+ 树的一个节点对应一个数据页;B+ 树层高越高要读取到内存的数据页越多,IO 次数越多;

innodb 一个节点 16KB;

假设:key 为 10byte 且指针大小 6 byte,假设一行记录的大小为 1KB;那么一个非叶子节点可存下 16KB / 16byte = 1024 个(key + point);每个叶子节点可存储 1024 行数据;
结论:2层 B+ 树叶子节点 1024 个,可容纳最大记录数为:1024*16 = 16384;3层 B+ 树叶子节点 1024*1024 ,可容纳最大记录数为:1024*1024*16 = 16777216;4层 B+ 树叶子节点 1024*1024*1024,可容纳最大记录数为:1024*1024*1024*16 = 17179869185;

关于自增 ID

  • 超过类型最大值会报错;
  • 类型 bigint 范围:( − 2 63 -2^{63} 263, 2 63 − 1 2^{63} - 1 2631)
  • 假设采用 bigint,1 秒插入 1 亿条数据,大概需要 5849 年才会用完索引;

聚集索引

按照主键构造的 B+ 树;叶子节点中存放数据页;数据也是索引的一部分;

select * from user where id >= 18 and id < 40;

image.png

辅助索引

叶子节点不包含行记录的全部数据;辅助索引的叶子节点中,除了用来排序的 key 还包含一个 bookmark;该书签存储了聚集索引的 key;

select * from user where lockyNum = 33;

image.png

innodb 体系结构

image.png

Buffer Pool

Buffer Pool 缓存表和索引数据;采用 LRU 算法,让 Buffer Pool 只缓存比较热的数据;

image.png


http://www.ppmy.cn/server/131781.html

相关文章

tp8自带的文件缓存如何配置

TP8自带的缓存是文件缓存。‌ ThinkPHP6默认的缓存驱动是文件缓存&#xff0c;它将缓存数据存储在应用的runtime目录下的cache目录中。文件缓存适用于单机环境下的应用&#xff0c;对于数据量较小且读写频率较低的应用场景&#xff0c;是一种简单有效的缓存方案‌。 ThinkPHP8…

oracle归档日志爆满问题处理

最近客户单位的oracle数据库出了问题&#xff0c;经常出现无法连接,报错提示 ORA-00257: archiver error, Connect internal only, until freed.&#xff0c;手动清除归档日志后可以恢复访问&#xff0c;但是过不了几天依旧会爆满&#xff0c;每日生成的归档日志很大。经过详细…

私域流量运营的误区

私域流量运营是近年来营销领域的重要趋势&#xff0c;但在实际操作中&#xff0c;很多企业和个人容易陷入一些误区。以下是几个常见的私域流量运营误区及其解决方法&#xff1a; 1. 只关注流量&#xff0c;不重视内容 误区&#xff1a;许多运营者认为&#xff0c;只要吸引到足…

Web自动化Demo-Kotlin+Selenium

1.新建工程 打开Aqua&#xff0c;点击New Project选中Kotlin&#xff0c;配置如下&#xff1a; 然后在build.gradle.kts文件中添加依赖 plugins {kotlin("jvm") version "1.9.23" }group "org.example" version "1.0-SNAPSHOT"rep…

IRP默认最小流程

IRP是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时&#xff0c;应用程序会发出I/O请求&#xff0c;操作系统将相应的I/O请求转换成相应的IRP&#xff0c;不同的IRP会根据类型被分派到不同的派遣例程中进行处理。 irp相当于R3下的消息&#xff0c…

ETLCloud 在 Linux 上的安装与使用指南

一、概述 ETLCloud 是一个开源的大数据集成平台&#xff0c;专注于数据的提取、转换、加载&#xff08;ETL&#xff09;过程。本文将详细介绍如何在 Linux 环境下安装 ETLCloud&#xff0c;并演示一些简单的使用方法&#xff0c;包括数据源管理、作业创建和任务调度。 二、安…

特征点检测与匹配是计算机视觉中的基础任务之一,广泛应用于图像配准、物体识别、运动估计、三维重建等领域。

特征点检测与匹配是计算机视觉中的基础任务之一&#xff0c;广泛应用于图像配准、物体识别、运动估计、三维重建等领域。下面是一些关键的知识点&#xff1a; 1. 特征点检测 特征点检测的目的是从图像中找到独特的、稳定的点&#xff0c;这些点在图像变化&#xff08;如旋转、…

社交电商的变革与创新:2+1 链动模式 S2B2C 商城小程序的崛起

摘要&#xff1a;本文探讨了社交电商领域中各大巨头的发展动态&#xff0c;分析了在市场竞争环境变化下巨头们面临的挑战以及调整策略。同时&#xff0c;引入关键词“21 链动模式 S2B2C 商城小程序源码”&#xff0c;阐述其在社交电商领域的创新应用和优势&#xff0c;为社交电…