MySQL索引详解,面试必问

1、什么是索引?

索引是帮助MySQL高效获取数据的数据结构(有序)。

除了数据之外,数据库系统还维护满足特定查找算法的数据结构,这些查找算法以某种方式引用(指向)数据,从而可以在这些数据结构上实现高级查找算法。这个数据结构就是索引。

[En]

In addition to the data, the database system maintains data structures that meet specific lookup algorithms, which refer to (point to) the data in some way, so that advanced lookup algorithms can be implemented on these data structures. this data structure is the index.

图示:

索引本身也非常大,通常以索引文件的形式存储在磁盘上。

[En]

The index itself is also very large and is generally stored on disk in the form of index files.

2、说一下索引有哪些优势有哪些劣势?

优势:

1、提高数据的查询效率,降低了数据库的IO成本;

2、通过索引列对数据进行排序,可以大大降低排序的成本,即降低了CPU的消耗。

劣势:

1、实际上索引也是一张表,该表中保存了主键和索引字段,并指向实体表的记录,所以索引列也是要占用空间的;

2、虽然索引大大提高了查询效率,但同时也降低了更新表的速度,如对表进行insert,update,delete。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。每次更新或添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

3、介绍一下索引的数据结构?

索引是在MySQL的引擎层中实现的,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。

MySQL目前提供了以下四种结构的索引:

1、BTREE索引:最常见的索引类型,大部分索引都支持B树索引。

2、HASH索引(了解):只有Memory引擎支持,适用场景简单。

3、R-TREE索引(了解):即空间索引,是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型。

4、Full-text索引(了解):即全文索引,也是MyISAM引擎的一个特殊索引类型,主要用于全文检索,InnoDB从MySQL5.6开始支持全文检索。

我们平常所说的索引,如果没有特别指明,都指的是B+树索引。其中InnoDB引擎,默认使用的就是B+树结构的索引。

4、BTREE索引的检索原理

MySQL索引详解,面试必问

初始化简介:

一颗B+树,浅蓝色的块我们称之为一个磁盘块,每个磁盘块包含几个数据项(深蓝色)和指针(黄色);

如:磁盘块1包含数据项17和35,包含指针P1,P2,P3;

P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块;

真实数据仅存在于叶节点上,即3、5、9、10、13、15、28、29、36、60、75、79、90、99

[En]

Real data exists only on leaf nodes, that is, 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90, 99

非叶子节点不存储真实数据,而只存储引导搜索方向的数据项,如:17、35在数据表中并不真正存在。

[En]

Non-leaf nodes do not store real data, but only store data items that guide the search direction, such as: 17, 35 do not really exist in the data table.

查找过程:

如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针;

通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针;

通过磁盘块3的P2指针的磁盘地址把磁盘块8由磁盘加载到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,共计3次IO。

总结:

真实的情况是,3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要3次IO,性能提高将是巨大的;

如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,成本非常高。

5、索引分为哪些类型?

单值索引:即一个索引只包含一列,一个表可以有多个单列索引。

[En]

Single-valued index: that is, an index contains only a single column, and a table can have multiple single-column indexes.

唯一索引:索引列的值必须是唯一的,但允许空值。

[En]

Unique index: the value of the index column must be unique, but null values are allowed.

复合索引:即一个索引包含多个列。

[En]

Composite index: that is, an index contains multiple columns.

6、索引的基本语法?

1、创建索引:

方式1:

create [UNIQUE] index 索引名 on 表名(字段名…);

示例:create [UNIQUE] index idx_city_name on city(city_name);

方式2:

alter table 表名 add index 索引名(字段名…)

示例:alter table city add index idx_city_name(city_name);

2、查看索引:

show index from 表名;

示例:show index from city;

3、删除索引:

drop index 索引名 on 表名;

示例:drop index idx_city_name on city;

7、哪些情况需要创建索引?

1、主键自动建立唯一索引

2、频繁作为查询条件的字段应创建索引

3、查询中与其它表关联的字段,外键关系建立索引

4、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

5、查询中统计或分组字段

8、哪些情况不需要创建索引?

1、数据量太少

2、经常做增删改频繁操作的的字段

3、数据重复且分布平均的表字段

解释:假如一个表有10万记录,有一个字段只有true和false两种值,且每个值的分布概率大约为50%,那么这个对该字段建索引不会提高查询效率;

索引选择性:索引列中不同值的数量/表记录的数量

[En]

Index selectivity: number of different values in index columns / number of table records

如果一个表中有2000条数据,索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99,选择性越接近1,索引的效率越高。

4、where条件里用不到的字段

Original: https://www.cnblogs.com/xilichenbokeyuan/p/15687544.html
Author: 卫盾
Title: MySQL索引详解,面试必问

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507956/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关于CATALINA_HOME 和 CATALINA_BASE 的区别

    以下内容从官方复制出来的* 这些是一些重要的tomcat目录: 在整个文档中,都引用了以下两个属性: 默认情况下,CATALINA_HOME和CATALINA_BASE指向同一目录…

    数据库 2023年6月11日
    078
  • Javascript中“==”与“===”的区别

    在Javascript中有”==”和”===”两种比较运行符,那么他们有什么区别呢? 一、对于string,number等基础类型,…

    数据库 2023年6月9日
    086
  • 十一章 配置文件参数化

    把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中 1. 小配置文件(.properties) 2. 好处 : 利于维护 1.配置文件参数化开发步骤 已数…

    数据库 2023年6月14日
    069
  • springboot~手动加载thymeleaf模版

    thymeleaf在spring-mvc时代很是盛行,与freemaker组成了两大模版引擎,而进行springboot之后,很多项目都采用前后分离的模式,这使得模板引擎关注度少了…

    数据库 2023年6月6日
    0105
  • OAuth2 Authorization Server

    基于Spring Security 5 的 Authorization Server的写法 先看演示 pom.xml <?xml version="1.0&quot…

    数据库 2023年6月14日
    0101
  • 9.回文数

    给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而…

    数据库 2023年6月16日
    062
  • [LeetCode]9. 回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解…

    数据库 2023年6月9日
    0150
  • Mysql 的Innodb引擎和Myisam数据结构和区别

    先大体看一下MySQL的SQL layer层的一个架构流程: 简要介绍一些关键模块: [En] Give a brief description of some key modul…

    数据库 2023年5月24日
    080
  • 【JDBC】笔记(1)— JDBC概述

    1、JDBC是什么?Java DataBase Connectivity(Java语言连接数据库) 2、JDBC的本质是什么?JDBC是SUN公司制定的一套 接口(实质)java….

    数据库 2023年5月24日
    084
  • 华为云操作记录——JavaWeb 环境搭建

    华为云操作记录 创建用户 新建用户 sudo adduser weirwei 添加免密 root 权限 sudo vim /etc/sudoers 添加 root 权限 sudo …

    数据库 2023年6月9日
    067
  • jmeter的一些概念知识

    前言 一、Jmeter的作用 – 1.jmeter进行接口操作 2. jmeter进行性能操作 二、Jmeter的一些概念的理解 – 1.事务 2. TPS…

    数据库 2023年6月6日
    091
  • 设计模式之七大原则

    1.单一职责原则: 不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责 使用一个列子来表达,一个动物类,动物可以使用里面的方法进行奔跑: //单一职责原则测试 pu…

    数据库 2023年6月6日
    099
  • python pywin32学习笔记

    参考博客链接 参考博客链接 pyhandle windows窗体句柄,int 类型  className 窗体类名  text 窗体标题 窗体置顶  窗体最大化 通过父pyhand…

    数据库 2023年6月11日
    076
  • 20 行代码!带你快速构建基础文本搜索引擎 ⛵

    💡 作者:韩信子@ShowMeAI📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41📘 深度学习实战系列:https://www.s…

    数据库 2023年6月14日
    073
  • Read View的可见性判断理解

    读了 @SnailMann大佬【MySQL笔记】正确的理解MySQL的MVCC及实现原理 收益颇丰,非常感谢! 但对其中如何判断事务是否可见性还是不太理解,于是作了本文,在原博客基…

    数据库 2023年6月16日
    068
  • Class文件结构分析

    概述 在Java语言中,Java虚拟机只能理解 &#x5B57;&#x8282;&#x7801;( class&#x6587;&#x4EF6…

    数据库 2023年6月11日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球