首页 > 数据库 >mysql:数据量过多时使用索引覆盖

mysql:数据量过多时使用索引覆盖

时间:2022-12-06 11:12:37浏览次数:44  
标签:10 name age id 索引 数据量 mysql 过多时 主键

1. 什么是索引?

索引(在 MySQL 中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录,这个比方虽然被用的最多但是也是最恰如其当的,在查询书本中的某个知识点不借助目录的情况下,往往都找的够呛,那么索引相较于数据库的重要性也可见一斑。

2. 索引的有哪些种类?

索引的种类这里只罗列出InnoDB支持的索引:主键索引(PRIMARY),普通索引(INDEX),唯一索引(UNIQUE),组合索引,总体划分为两类,主键索引也被称为聚簇索引(clustered index),其余都称呼为非主键索引也被称为二级索引(secondary index)。

3. InnoDB的不同的索引组织结构是怎样的呢?

众所周知在InnoDB引用的是B+树索引模型,这里对B+树结构暂时不做过多阐述,很多文章都有描述,在第二问中我们对索引的种类划分为两大类主键索引和非主键索引,那么问题就在于比较两种索引的区别了,我们这里建立一张学生表,其中包含字段id设置主键索引、name设置普通索引、age(无处理),并向数据库中插入4条数据:("小赵", 10)("小王", 11)("小李", 12)("小陈", 13)

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '名称',
  `age` int(3) unsigned NOT NULL DEFAULT '1' COMMENT '年龄',
  PRIMARY KEY (`id`),
  KEY `I_name` (`name`)
) ENGINE=InnoDB;

INSERT INTO student (name, age) VALUES("小赵", 10),("小王", 11),("小李", 12),("小陈", 13);

这里我们设置了主键为自增,那么此时数据库里数据为

 

每一个索引在 InnoDB 里面对应一棵B+树,那么此时就存着两棵B+树。

 

 

可以发现区别在与叶子节点中,主键索引存储了整行数据,而非主键索引中存储的值为主键id, 在我们执行如下sql后

 

SELECT age FROM student WHERE name = '小李';

流程为:

  1. 在name索引树上找到名称为小李的节点 id为03
  2. 从id索引树上找到id为03的节点 获取所有数据
  3. 从数据中获取字段命为age的值返回 12

在流程中从非主键索引树搜索回到主键索引树搜索的过程称为:回表,在本次查询中因为查询结果只存在主键索引树中,我们必须回表才能查询到结果,那么如何优化这个过程呢?引入正文覆盖索引

4. 什么是覆盖索引?

覆盖索引(covering index ,或称为索引覆盖)即从非主键索引中就能查到的记录,而不需要查询主键索引中的记录,避免了回表的产生减少了树的搜索次数,显著提升性能。

5. 如何使用是覆盖索引?

之前我们已经建立了表student,那么现在出现的业务需求中要求根据名称获取学生的年龄,并且该搜索场景非常频繁,那么先在我们删除掉之前以字段name建立的普通索引,以name和age两个字段建立联合索引,sql命令与建立后的索引树结构如下

ALTER TABLE student DROP INDEX I_name;
ALTER TABLE student ADD INDEX I_name_age(name, age);

 

那在我们再次执行如下sql后

 

SELECT age FROM student WHERE name = '小李';

流程为:

  1. 在name,age联合索引树上找到名称为小李的节点
  2. 此时节点索引里包含信息age 直接返回 12

6. 如何确定数据库成功使用了覆盖索引呢?

当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息

这里我们很清楚的看到Extra中Using index表明我们成功使用了覆盖

7. 实际使用场景

  • Limit分页优化
  • 传统分页:
Select * from table limit 10000,10;

LIMIT原理:

Limit 10000,10 偏移量越大则越慢

  • 推荐分页:
  • 分页方式一:
Select * from table WHERE id>=23423 limit 11; #10+1 (每页10条)
Select * from table WHERE id>=23434 limit 11;
  • 分页方式二:
Select * from table WHERE id >= ( select id from table limit 10000,1 ) limit 10;
  • 分页方式三:
Select * from table INNER JOIN (SELECT id from table limit 10000,10) USING(id)

 

其中分页方式2和分页方式3 就用到了索引覆盖,减少回表查询所要浪费的时间,提高查询速度。

 

reference:https://juejin.cn/post/6844903967365791752,https://zhuanlan.zhihu.com/p/541611177

标签:10,name,age,id,索引,数据量,mysql,过多时,主键
From: https://www.cnblogs.com/jyf2018/p/16954652.html

相关文章

  • flink sql 程序消费kafka数据到mysql设置参数connector.url问题汇总
    1.问题现象:使用flinksql程序消费kafka数据写入mysql时,使用TVF表值函数,START_ENENT_TIME和END_ENENT_TIME始终比消费时间小大约13小时。解决办法在写入mysql的sink......
  • MySql的运行(Windows环境)
    MySql的运行(Windows环境)MySql数据库是免费、开源的关系型数据库一、MySql的下载mysql-5.7win64下载地址:https://downloads.mysql.com/archives/community/注意:这里......
  • 详解监听MySQL的binlog日志工具分析:Canal
    Canal是阿里巴巴旗下的一款开源项目,利用Java开发。主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费,目前主要支持MySQL。GitHub地址:https://github.com/alib......
  • Mysqlbackup 增量备份恢复示例
    适用范围5.7+方案概述在生产环境中,我们都会对数据库进行备份,我们知道ORACLE的RMAN备份很灵活,有全备,增量,归档等等备份方式!针对MYSQL来讲,也有一款自己的备份工具mysql......
  • mysql基础问题三问(底层逻辑;正在执行;日志观察)
    背景:经常面试会遇到且实际工作中也会应用到的三个场景:目录:一.mysql查询时的底层原理是什么?二.如何查看正在执行的mysql语句?三.如何观察mysql运行过程中的日志信息?--......
  • MySQL
    MySQL创建数据表创建MySQL数据表需要以下信息:表名表字段名定义每个表字段语法以下为创建MySQL数据表的SQL通用语法:CREATETABLEtable_name(column_namecolumn_type);以......
  • 《MySQL必知必会》知识汇总三
    十三、联结表本章将介绍什么是联结,为什么使用联结,如何编写使用联结的select语句联结简单来说,联结是一种机制,用来在一条select语句中关联表,因此称为联结。使用特殊的语......
  • mysql四种连接测试
    #创建并选择数据库CREATEDATABASEshop;USEshop;#创建商品分类表CREATETABLEsh_goods_category(idINTUNSIGNEDPRIMARYKEYAUTO_INCREMENTCOMMENT'分类id',......
  • MYSQL---纯手写sql之查询【日期字段】
    前言:MySQL查询指定的日期格式字段,使用date_format(date,format)函数date_Format('自定义时间','时间格式')自定义时间:2022-12-0500:00:00时间格式:%Y-%M-%......
  • 数据量大小和模型大小之间的关系
    作者:Henry链接:https://zhuanlan.zhihu.com/p/539233251来源:知乎1、从模型方面考虑。举例说明:本身问题是二次的,用线性模型处理问题就是欠拟合,用三次及更高次处理问题就是......