java八股文面试[数据库]——索引的基本原理、设计原则

索引的设计原则

索引覆盖是什么:

索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。

索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响跃愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但是当数据量逐渐增大时,性能则会急剧下降。

一、索引基础

Q1:索引是如何工作的?

A1:要理解MySQL中索引是如何工作的,最简单是方法就是区看一看一本书的目录。倘若想在一本书中找到某个特定命题,一般会先看书的“索引”,找到对应的页码。

那么在MySQL中,存储引擎的用类似的方法使用索引,它先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。

Q2:MySQL支持的索引的类型?以及优缺点

A2:B-Tree 索引、哈希索引、空间数据索引、全文索引等其他索引

  • B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到跟的距离相同。叶子页比较特殊,它的指针指向的是被索引的数据,而不是其他的节点页。

图1 B-Tree (从技术上来说是B+tree)索引树种的部分条目示例

回想BTree的查找操作:进行查找操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查 找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的 data 。

这也就意味着B-Tree索引能够加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎很具这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了节点页中的上限和下限。

那么有哪些可以使用B-Tree索引的查询类型:

(1)全值匹配:

(2)匹配最左前缀

(3)匹配列前缀

(4)匹配范围值

(5)精确匹配某一列并范围匹配另外一列

(6)只范围跟索引的查询

除了上述适用之外,它也存在局限性:

(1)如果不是按照索引的最左列开始查找,那么无法使用索引

(2)不能跳过索引中的列

(3)如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询。

哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

限制之处:

(1)哈希索引只包含哈希值和行指针,而不存储字段值。

(2)哈希索引数据不是按照索引值的顺序排序的,所以无法用于排序。

(3)不支持部分索引列匹配查找。

(4)只支持等值比较查询

(5)哈希冲突多的话,索引维护操作的代价也会很高。

空间数据索引(R-Tree)

MyISAM 表支持空间索引,可以用作地理数据存储。这类索引无须前缀查询。空间索引会从所有维度来索引数据。这一类型索引,接触的很少,以后碰到再做详细总结。

全文索引,这是一种特殊类型的索引,它查找的是文本中的关键词。

知识点:

【mysql】索引的基本原理_哔哩哔哩_bilibili

【mysql】索引的设计原则_哔哩哔哩_bilibili

【mysql】索引覆盖是什么_哔哩哔哩_bilibili

【2023年面试】mysql索引的基本原理_哔哩哔哩_bilibili

【MySQL】聚集索引和非聚集索引 - 知乎

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

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

相关文章

SQLserver基础入门理论(超基础)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

【小沐学Unity3d】3ds Max 多维子材质编辑(Multi/Sub-object)

文章目录 1、简介2、精简材质编辑器2.1 先创建多维子材质,后指定它2.2 先指定标准材质,后自动创建多维子材质 3、Slate材质编辑器3.1 编辑器简介3.2 编辑器使用 结语 1、简介 多维子材质(Multi/Sub-object)是为一个模形&#xff0…

使用Vue3和Vite升级你的Vue2+Webpack项目

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

CSS水平垂直居中方案

1 前言 水平居中、垂直居中是前端面试百问不厌的问题。其实现方案也是多种多样,常叫人头昏眼花。 水平方向可以认为是内联方向,垂直方向认为是块级方向。 2 内联元素的水平垂直居中 首先,常见内联元素有:a、span、em、b、stro…

使用PAM保障开发运营安全

硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞。以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施,构成巨大的数据被盗风险。 什么是PAM 特权访问管理 (PAM) 是指一组 IT 安全管理原则,可…

解决gitee仓库中 .git 文件夹过大的问题

最近,许多项目都迁移到gitee。使用的也越来越频繁,但是今天突然收到一个仓库爆满的提示。让我一脸懵逼。本文将详细为你解答,这种情况如何处理。 1、起因 我收到的报错如下: remote: Powered by GITEE.COM [GNK-6.4] remote: T…

RDMA性能优化经验浅谈

一、RDMA概述 首先我们介绍一下RDMA的一些核心概念,当然了,我并不打算写他的API以及调用方式,我们更多关注这些基础概念背后的硬件执行方式和原理,对于这些原理的理解是能够写出高性能RDMA程序的关键。 Memory Region RDMA的网…

【运维】hadoop3.0.3集群安装(二) 横向新增节点和删除节点

文章目录 一. 新增节点1.配置、安装1.1. 所有节点配置新节点主机映射1.2. 上传安装包1.3. 配置环境变量1.4. 配置workers1.5. 清理之前集群的数据目录(如有) 2. 新增节点启动3. 平衡DataNode节点 二. 删除节点1. namenode节点操作1.1. 添加excludes文件1…

spring高级源码50讲-43-50(spring续)

其它 43) FactoryBean 演示 - FactoryBean 代码参考 package com.itheima.a43;import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan;ComponentScan public class A43 {publi…

在访问一个网页时弹出的浏览器窗口,如何用selenium 网页自动化解决?

相信大家在使用selenium做网页自动化时,会遇到如下这样的一个场景: 在你使用get访问某一个网址时,会在页面中弹出如上图所示的弹出框。 首先想到是利用Alert类来处理它。 然而,很不幸,Alert类处理的结果就是没有结果…

Flutter系列文章-Flutter在实际业务中的应用

不同场景下的解决方案 1. 跨平台开发: 在移动应用开发中,面对不同的平台(iOS和Android),我们通常需要编写两套不同的代码。而Flutter通过一套代码可以构建适用于多个平台的应用,大大提高了开发效率&#x…

ArrayList LinkedList

ArrayList 和 LinkedList 区别 ArrayList和LinkedList都是Java集合框架中的实现类,用于存储和操作数据。它们在底层实现和性能特点上有一些区别。 数据结构:ArrayList底层使用数组实现,而LinkedList底层使用双向链表实现。这导致它们在内存结…

ModaHub魔搭社区:自动化机器学习神器Auto-Sklearn

Auto-Sklearn Auto-Sklearn是一个开源库,用于在 Python 中执行 AutoML。它利用流行的 Scikit-Learn 机器学习库进行数据转换和机器学习算法。 它是由Matthias Feurer等人开发的。并在他们 2015 年题为“efficient and robust automated machine learning 高效且稳健的自动…

YOLOv7框架解析

YOLOv7概念 YOLOv7是基于YOLO系列的目标检测算法,由Ultra-Light-Fast-Detection(ULFD)和Scaled-YOLOv4两种算法结合而来。它是一种高效、准确的目标检测算法,具有以下特点: 1. 高效:YOLOv7在保持准确率的…

CSP 202305-1 重复局面

题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3次以上,可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用大小为 88 的字符数组来表示,其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 k、…

说说TIME_WAIT和CLOSE_WAIT区别

分析&回答 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接&#xf…

requests 库:发送 form-data 格式的 http 请求 (python)

安装 requests-toolbelt !pip install requests-toolbeltdemo from requests_toolbelt import MultipartEncoder import requestsm MultipartEncoder(fields{query: """第一,向量化匹配是有能力上限的。搜索引擎实现语义搜索已经是好几年的事情了…

学校头歌作业1_4日期格式化输出(头歌作业[Python])

在CSDN上补充前几期的内容 第1关:空格分隔格式化输出 # 实验要求 # 在三行中分别输入当前的年、月、日的整数值,按要求完成输出。 # 1 输出年月日,空格分隔,格式:2020 09 16# 测试数据 # 输入(>>>开头的行表…

MySQL索引和查询优化

文章目录 1.Mysql索引2. b- tree 与 b tree3.覆盖索引和回表查询4.查询优化1.Explain 5.优化实战举例**用户搜索****订单查询****分页查询** 1.Mysql索引 MySQL索引是一种用于提高数据库查询效率的数据结构。它可以加快数据检索的速度,减少查询所需的IO操作和计算…

leetcode 1365. 有多少小于当前数字的数字

2023.9.2 本题直观的解法就是双层for循环暴力求解&#xff1a; 暴力解&#xff1a; class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> ans;for(int i0; i<nums.size(); i){int temp 0;//比当前元素…