【阅读】《MYSQL技术内幕:InnoDB》索引使用

news2025/1/11 14:21:18

B+树索引使用

不同应用下

  1. OLTP 应用中,查询操作只从数据库中取得一小部分数据,如根据主键值取得用户信息,根据订单号取得订单的详细信息。通常会添加主键索引
  2. OLAP 应用中,查询多是面向分析的查询,目的是为决策者提供支持,如这个月每个用户的消费情况,销售额同比、环比增长的情况。通常会添加时间索引

使用联合索引

  1. 创建索引
--创建表并添加对应的数据
CREATE TABLE `buy_log` (
  `user_id` INT UNSIGNED NOT NULL,
  `buy_date` DATE NULL,
  `log` TEXT(4000) NULL
) ENGINE=InnoDB;

INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('1', '2023-01-01', 'buy some in 2023-01-01');
INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('2', '2023-01-01', 'buy some2 in 2023-01-01');
INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('3', '2023-02-01', 'buy some3 in 2023-02-01');
INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('1', '2023-01-02', 'buy some2 in 2023-01-02');
INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('3', '2023-01-03', 'buy some4 in 2023-01-03');
INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('1', '2023-01-04', 'buy some in 2023-01-04');
INSERT INTO `buy_log` (`user_id`, `buy_date`, `log`) VALUES ('1', '2023-01-01', 'buy some3 in 2023-01-01');
-- 创建索引
alter table buy_log add key (user_id);
alter table buy_log add key (user_id, buy_date); 

查看索引信息

show index from buy_log

在这里插入图片描述
总共创建了三个索引,其中 user_id_2 就是联合索引
2. 查看索引的使用

explain select user_id,buy_date from buy_log where user_id =2;

在这里插入图片描述
possible_keys 可以看出有两个索引选择,key 表示最终选择了 user_id 这个索引。
这时并没有选择联合索引。

explain select user_id,buy_date from buy_log where user_id =1 order by buy_date desc;

在这里插入图片描述
当添加上根据 buy_date 进行排序时,优化器就选择了 user_id_2 这个联合索引了,因为在这个联合索引中 buy_date 已经排序好了,根据该索引取出数据,无需再对 buy_date 做一次额外的排序操作。

alter table buy_log add key (user_id, buy_date, log(100));
drop index user_id_2 on buy_log;
explain select user_id,buy_date,log from buy_log where user_id=1 order by log(100) asc;

在这里插入图片描述
当我删除 user_id_2 索引,添加 user_id_3 (user_id, buy_date, log)索引时,再执行 上述查询语句,将不使用 user_id_3 索引。

索引(a,b,c):

  • 使用索引
    • where a=1 and b =2 order by c
    • where a=1 order by b
  • 不使用索引 (a,b,c)
    - where a=1 order by c
explain select user_id,buy_date from buy_log where user_id=1 order by log(100) asc;

在这里插入图片描述
但是我不查询 log 值时就会使用user_id_3 的联合索引。

索引使用不仅是和 where 后面的语句相关,还和查询的字段相关

使用覆盖索引

概念:从辅助索引中可以查询到记录,而不需要查询聚集索引中的记录

explain select count(*) from buy_log;

在这里插入图片描述
这里的 possible_key 列为空,而 实际执行中优化器却选择user_id 的辅助索引,列 Extra 列的 Using index 就是代表了优化器进行了覆盖索引操作。

不使用索引

select 字段和索引没有关系

explain select user_id,buy_date,log from buy_log where user_id=1;

在这里插入图片描述
这里的 log 字段不在索引中,所以没有使用索引

提示使用索引

显示的告诉优化使用索引,但是不一定可以之间使用上

explain select * from buy_log use index(user_id) where user_id=1;

在这里插入图片描述

强制使用索引

explain select * from buy_log where user_id=1;

在这里插入图片描述

explain select * from buy_log force index(user_id) where user_id=1;

在这里插入图片描述
可以看出使用 force index({index_name}) 可以强制使用索引

hash 索引使用

只提供内部自适应 hash 索引,数据库自身创建并使用,DBA 本身并不能对其进行干预

全文索引使用

  1. 创建索引
CREATE TABLE `fts_a` (
  `FTS_DOC_ID` BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
  `body` TEXT NULL,
  PRIMARY KEY (`FTS_DOC_ID`));
  
INSERT INTO `fts_a` (`body`) VALUES ('Pease porridge in the pot');
INSERT INTO `fts_a` (`body`) VALUES ('pease porridge hot, pease porridge cold');
INSERT INTO `fts_a` (`body`) VALUES ('Nine days old');
INSERT INTO `fts_a` (`body`) VALUES ('Some like it hot, some like it cold');
INSERT INTO `fts_a` (`body`) VALUES ('Some like it in the pot');
INSERT INTO `fts_a` (`body`) VALUES ('Nine dys old');
INSERT INTO `fts_a` (`body`) VALUES ('I like cold days');
-- 创建倒排索引
create fulltext index idx_fts on fts_a(body);

SELECT * FROM fts_a;

在这里插入图片描述
2. 查看分词对应的信息

set global innodb_ft_aux_table = 'test/fts_a';
select * from information_schema.INNODB_FT_INDEX_TABLE;

在这里插入图片描述
每个 word 对应一个文件id以及位置
3. 删除时

DELETE FROM `fts_a` WHERE `FTS_DOC_ID`='7';
select * from information_schema.INNODB_FT_DELETED;

在这里插入图片描述
虽然执行删除,但是在对于 INNODB_FT_INDEX_TABLE 表没有变化,而在 INNODB_FT_DELETED 中发现对应的记录。

-- 配置只对全文索引优化
set global innodb_optimize_fulltext_only=1;
-- 优化表
optimize table fts_a;
select * from information_schema.INNODB_FT_BEING_DELETED;
select * from information_schema.INNODB_FT_INDEX_TABLE;

在这里插入图片描述
当进行 optimize table后,INNODB_FT_INDEX_TABLE表才发生变化,没有了 doc_id=7 相关的记录。虽然表中没有 7 这条记录,但是不能往 fts_a 表中插入 fts_doc_id =7 的记录。
4. 查询

explain select * from fts_a where body like 'Pease%'

没有使用索引

  • 使用Natural Language 方法查询
explain select * from fts_a where match(body) against('Pease' in natural language mode);

使用 natural language mode

select fts_doc_id,body,match(body)against('Pease') as relevent from fts_a;

获取相关性
获取相关性

模糊查询的不是一个单词,直接使用全文检索会得不到结果

  • 使用 Boolean 方法查询
    eg. 查询不包含 Pease 但是有 hot 的内容
select * from fts_a where match(body) against('-Pease hot' in boolean mode);

在这里插入图片描述
Boolean 支持的操作符如下图所示:
在这里插入图片描述
-Query expansion
隐含单词的拓展查询,比如要查询 database ,客户希望查询的不只是 databse 还有 MYSQL,Oracle, 等等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress网站速度优化教程

网站访问速度是影响网站访客流量的重要因素,几秒内打不开网站会导致很多访客的流失,因此在WordPress程序中网站速度优化尤为重要。 当然服务器地区和配置也会影响访问速度 服务器速度:国内>香港或国外服务器 配置你有钱就上好的&#xff0…

【7.2 指标的应用与设计(15%)-业务数据分析】——CDA

目录 I.大纲 II.可视化图表 2.1 业务图表决策树 2.2 比较 2.3 序列 2.4 构成 2.5 描述 I.大纲 II.可视化图表 2.1 业务图表决策树 分成了4类:比较、序列、构成、描述类 1.比较类:不同对象、项目间 大小多少,好坏关系程度。&#xff…

TikTok Shop美国小店现状如何?

SHOP美国小店现状如何?在2022年11月份,TikTok已经正式公布了TikTok Shop美国站,那么目前情况如何呢?有什么困扰?有参加美国小店闭环测试之后的效果并不乐观的卖家表示,美国电商市场相对稳定,且中…

使用Docker部署前后端分离项目

目录 引言 部署需要用到的镜像汇总 1. Redis部署 (1)搜索Redis镜像 (2)拉取Redis镜像 (3)创建Redis容器 2. MySQL部署 (1)拉取MySQL镜像、 (2)查看…

《WebGL编程指南》学习笔记(更新中)

《WebGL编程指南》学习笔记前言1.第一章 WebGL概述1.1 WebGL优势1.2 WebGL起源1.3 WebGL程序结构2.第二章 WebGL入门2.1 了解canvas2.1.1 使用canvas绘制一个长方形2.2 第一个WebGL程序(清除画布)2.3 绘制一个点(版本1——了解着色器&#xf…

k8s之job和cronjob

写在前面 本文一起看下使用k8s来进行作业和定时作业。 1:k8s的业务类型 如果是按照业务类型来划分的话,可以分为离线业务和在线业务,如下: 在线业务:容器启动之后就一直不退出的业务,如Nginx 离线业务&…

XSS-Game 通关教程,XSS-Game level1-18,XSS靶场通关教程

​ 「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」: 此文章已录入专栏 靶场通关教程 XSS-GameXSS-Game level1XSS-Game level2XSS-Game level3XSS-Game level4XSS-…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.15 绘制温度曲线

本节对应的视频讲解:B_站_视_频 https://www.bilibili.com/video/BV1L24y1Q7hc 前面已经讲解了 QPainter 绘图的基本使用 其中包括: 绘制图形 点、线、矩形、圆角矩形、椭圆、圆、圆弧、饼图、弦图、多段线、多边形、路径、文本、图片 画笔设置 线宽…

crawlergo联动xray漏洞挖掘

SRC漏洞挖掘 简介 SRC漏洞平台:安全应急响应中心(SRC, Security Response Center),是企业用于对外接收来自用户发现并报告的产品安全漏洞的站点。说白了,就是连接白帽子和企业的平台,你去合法提交漏洞给他…

研讨会回顾 | 中国企业在软件自动化测试方面的实践现状、挑战及趋势探讨

2022年12月6日,龙智与软件测试自动化“领导者”SmartBear联合举办了主题为“如何通过自动化测试实现降本、增效与提质”的在线研讨会。 此次研讨会中,龙智技术总监李毅为大家分享中国企业在质量和测试中面临的挑战,以及自动化测试实践的现状与…

关于 Serverless 应用架构对企业价值的一些思考

作者:寒斜 前言 对于企业方而言,最关心的核心诉求就是如何能获取更多的营收,更高的利润,通俗点说就是如何赚更多的钱;企业赚钱的方式主要是通过出售企业服务,当用户购买更多的企业服务,企业赚…

【Linux】vim的基本操作

这里写目录标题一、vim编辑器1、基本概念2、基本操作二、vim指令集1、命令模式命令集2、底行模式命令集一、vim编辑器 1、基本概念 vi和vim都是多模式的编辑器,vim是vi的升级版本,并且兼容vi的所以指令。 vim有多种模式,本文讲解常用的3种模…

c++入门(命名空间+缺省参数+函数重载)

文章目录1. 命名空间1. c语言的两个域2. 命名空间的使用1.类型问题命名空间A和B的实现2. 变量问题3.三种访问方法1.指定命名空间访问2. 全局展开using namespace std 的含义尽量不使用using namespace std的原因3. 部分展开2. 缺省参数(备胎)1. 概念2.全缺省参数3.半缺省参数错…

2023/1/6 Vue学习笔记-3-生命周期

1 引出生命周期 透明度变化的案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&qu…

HTML实现动态旋转字母背景

演示 css html, body {background: radial-gradient(#181818, #000000);margin: 0;padding: 0;border: 0;-ms-overflow-style: none;}::-webkit-scrollbar {width: 0.5em;height: 0.5em;background-color: #c7c7c7;}/*定义滚动条轨道 内阴影圆角*/::-webkit-scrollbar-track {…

数据分析之数据相关性分析

相关性分析 作者&#xff1a;学者科技 时间&#xff1a;2022/12/25 应用场景 发现数据之间的关联性 比如 啤酒 和 尿布 删减统计指标 比如 城市里的温度传感器&#xff0c;相关性强的可以去掉以节约成本 挑选回归建模的变量 选择与因变量相关性高的自变量自变量间如果有高度…

数字漫画行业繁花似锦,国漫扎根本土文化“向外生长”?

2022年&#xff0c;一半是寒冰&#xff0c;一半是烈火。这一年&#xff0c;我们遇到了消费互联网的降温&#xff0c;包括互联网大厂降本增效潮到来&#xff0c;电商大促节不再公布销售额。同样&#xff0c;我们也见证了经济迸发的新活力&#xff0c;比如元宇宙、虚拟人掀起的热…

配置Domino解决CORS跨域问题

大家好&#xff0c;才是真的好。 前面我们讲过几篇Web应用开发的简单示例&#xff0c;主要功能是同一个站点的同一个应用里里面查看和搜索文档。如果对数据进行操作&#xff0c;可能多少会遇到网页跨域访问问题。 跨域&#xff0c;简单来说&#xff0c;就是浏览器对javascrip…

【知识图谱导论-浙大】第二章:知识图谱的表示

前文&#xff1a; 【知识图谱导论-浙大】第一章&#xff1a;知识图谱概论 本节内容的视频讲解如下&#xff1a; 【知识图谱理论】&#xff08;浙大2022知识图谱课程&#xff09;第二讲-知识图谱的表示什么是知识表示 简而言之&#xff0c;知识表示&#xff08;Knowledge Rep…

【HTML】纯CSS居然能做出这种效果,一款宝藏网页分享(超详细讲解 | 附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…