【MySQL是怎么运行的】二、索引

ops/2025/3/14 22:57:51/

引擎层有支持索引,如InnoDB和MyISAM,区别就是InnoDB支持事务、外键和行锁

索引物理结构

页:一页16KB,一页包含了多行记录
行:包含元数据和真实数据
元数据:

  1. record_type(记录的类型,0-普通,1-目录项,2-最小,3-最大)
  2. next_record(下一条记录)
    真实数据:c1,c2,c3,其他信息
    在这里插入图片描述
CREATE TABLE s1
(id           INT AUTO_INCREMENT,key1         VARCHAR(100),key2         INT,key3         VARCHAR(100),key_part1    VARCHAR(100),key_part2    VARCHAR(100),key_part3    VARCHAR(100),common_field VARCHAR(100),PRIMARY KEY (id),KEY idx_key1 (key1),UNIQUE KEY idx_key2 (key2),KEY idx_key3 (key3),KEY idx_key_part (key_part1, key_part2, key_part3)
) ENGINE = INNODBCHARSET = utf8;

上述的表一行占用的大小为:
**元数据:**行头信息5B+事务ID6B+回滚指针7B+7个边长字段7B=25B
**真实数据:**id和key2是int类型,固定4B,其他字段都是varchar类型1003+1=301B。总共4B+301B7=1814B
总计:1814B+25B=1839B≈1.8KB

索引设计原则

  1. 读多写少的字段,如mtime就不行
  2. 数据量较大(100w)、查询比较频繁(where,group by)的表建立索引,不建议db排序
  3. 尽量选择区分度高的列(如身份证号,性别不行,重复度大于10%也不行)作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
  4. 字符串类型的字段,字段的长度较长,考虑前缀索引
  5. 尽量使用联合索引,较少单例索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率

索引失效场景

  1. 不符合最左匹配原则、模糊查询%加在前面
  2. 索引上有函数或类型不匹配
  3. <>, or两侧有非索引字段

索引判断姿势

explain sql
type:针对单表的访问方法

  1. 结果值从最好到最坏依次是:
    system > ⭐️const️ > eq_ref > ⭐️ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > ⭐️range(底线) > index > ALL
    const️:唯一键等于,如select * from s1 where key2=?
    ref: 二级索引等于,如select * from s1 where key3=?
    range: 范围查询,如select * from s1 where key3 in (?,?)

  2. rows
    预估的需要读取的记录条数,走索引后的筛选出来的行数,值越小越好,代表走索引筛选的数量多,索引效率高

  3. filtered
    某个表经过搜索条件过滤后剩余记录条数的百分比,值越大越好,代表大多数结果都是通过索引查出来的,而不是服务层筛选的

  4. Extra
    一些额外的信息

  • Using where: 当我们使用全表扫描来执行对某个表的查询,并且该语句的WHERE子句中有针对该表的搜索条件时
  • Using index: 使用了覆盖索引
  • Using index condition:使用了索引下推
  • Using union:索引合并,使用多个索引来取交集、并集后进行回表的优化操作
  • Using filesort:文件排序,出现这个说明sql中有排序字段,要避免

索引如何优化

  1. 没索引就建索引
  2. 有索引但失效了就改sql,让索引生效。或强制InnoDB走预期索引

慢sql

慢sql包含读和写,一般超过100ms的执行时间我们都认为是慢sql。
慢查一般从索引方向治理
慢写一般从锁方向治理


http://www.ppmy.cn/ops/165782.html

相关文章

内检实验室LIMS系统在汽车制造行业的应用

随着汽车制造行业的快速发展&#xff0c;内检实验室在确保产品质量、提升生产效率和满足法规要求方面扮演着越来越重要的角色。内检实验室LIMS系统&#xff08;实验室信息管理系统&#xff09;通过数字化和自动化手段&#xff0c;为汽车制造行业的实验室管理带来了革命性的变化…

手写svm primal form形式

svm.py import numpy as npclass SVM:def __init__(self,C1.0,lr0.01,batch_size32,epochs100):self.CCself.lrlrself.batch_sizebatch_sizeself.epochsepochsself.wNoneself.b0.0self.epoch0#计算最高得分和对应w&#xff0c;bdef fit(self,X,y,X_valNone,y_valNone):sample,…

flink cdc同步mysql数据

一、api 添加依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-mysql-cdc</artifactId><!-- 请使用已发布的版本依赖&#xff0c;snapshot 版本的依赖需要本地自行编译。 --><version>3.3-SNAP…

【后端】【django drf】django自动导出优雅的api文档的写法

Django DRF API 编写规范&#xff08;包含 OpenAPI 生成规则&#xff09; 为了确保 Django DRF API 代码的可维护性、可扩展性&#xff0c;同时生成清晰、规范、结构层次分明的 OpenAPI 文档&#xff0c;必须遵循以下规则。 一、使用 drf-spectacular 生成 OpenAPI 文档 &…

2025年智能工单管理系统产品推荐

工单管理系统已成为企业数字化转型的“智能中枢”&#xff0c;尤其在生成式AI深度赋能的2025年&#xff0c;系统的选择直接影响30%以上的服务响应效率。本文从AI融合深度、产品竞争力、场景适配性等维度&#xff0c;为您精心推荐2025年五大智能工单系统。 一、轻帆云&#xff0…

05延迟任务精准发布文章(redis实现延迟任务、分布式锁)

上架不代表发布(需要发布app端才会显示文章&#xff09; 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间 延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在…

如何重置 MySQL root 用户的登录密码?

重置 MySQL root 密码的核心步骤是绕过权限验证登录数据库并更新密码字段。以下是具体方法&#xff1a; 方法一&#xff1a;通过 --SKIP-GRANT-TABLES 模式修改密码 停止 MySQL 服务 Windows&#xff1a;在命令行执行 net stop mysql&#xff08;服务名可能为 mysql80 或 mysql…

【实战篇】执行计划解析

执行计划解析 获取执行计划 数据库优化器可能会根据连接方式、连接条件等因素选择不同的执行计划。你可以通过 EXPLAIN 关键字查看两个查询的执行计划&#xff0c;以便更好地理解优化器的选择。 EXPLAIN SELECT ... -- 替换 ... 部分为你的查询内容观察执行计划并查看其中的…