IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL 数据库面试题总结(2022版) -> 正文阅读

[大数据]MySQL 数据库面试题总结(2022版)

MySQL 数据库面试题(2022版)

文章目录


同时,本文还提供思维导图供大家学习补充: 【金山文档】 MySQL数据库

在这里插入图片描述

一、基础

基本概念

MySQL有哪些数据库类型?

  • 数值类型

有包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示 1 字节、2 字节、3 字节、4 字节、8 字节的整数类型

1)任何整数类型都可以加上 UNSIGNED 属性,表示无符号整数。

2)任何整数类型都可以指定长度,但它不会限制数据的合法长度,仅仅限制了显示长度。
ref:数据库中的数据类型长度(理解)

还有包括 FLOAT、DOUBLE、DECIMAL 在内的小数类型

  • 字符串类型

包括 VARCHAR、CHAR、TEXT、BLOB。

注意:VARCHAR(n) 和 CHAR(n) 中的 n 并不代表字节个数,而是代表字符的个数。

  • 日期和时间类型

常用于表示日期和时间类型为 DATETIME、DATE 和 TIMESTAMP。

尽量使用 TIMESTAMP,空间效率高于 DATETIME。

ref MySQL 数据类型

CHAR 和 VARCHAR 区别?

首先可以明确的是 CHAR 是定长的,而 VARCHAR 是可以变长。

CHAR 会根据声明的字符串长度分配空间,并会使用空格对字符串右边进行尾部填充。所以在检索 CHAR 类型数据时尾部空格会被删除,如保存的是字符串 'char ',但最后查询到的是 ‘char’。又因为长度固定,所以存储效率高于 VARCHAR 类型。

VARCHAR 在 MySQL 5.0 之后长度支持到 65535 字节,但会在数据开头使用额外 1~2 个字节存储字符串长度(列长度小于 255 字节时使用 1 字节表示,否则 2 字节),在结尾使用 1 字节表示字符串结束。

再者,在存储方式上,CHAR 对英文字符(ASCII)占用 1 字节,对一个汉字使用用 2 字节。而 VARCHAR 对每个字符均使用 2 字节。

虽然 VARCHAR 是根据字符串长度分配存储空间的,但在内存中依旧使用声明长度进行排序等作业,故在使用时仍需综合考量字段长度。

ref:char与varchar类型区别的深度剖析

对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。
对于非常短的列,CHAR比VARCHAR在存储空间上更有效率。
使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。
尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。

数据库设计

什么是三大范式?

  • 第一范式(1NF):字段(或属性)是不可分割的最小单元,即不会有重复的列,体现原子性

  • 第二范式(2NF):满足 1NF 前提下,存在一个候选码,非主属性全部依赖该候选码,即存在主键,体现唯一性,专业术语则是消除部分函数依赖

  • 第三范式(3NF):满足 2NF 前提下,非主属性必须互不依赖,消除传递依赖

ref:如何理解关系型数据库的常见设计范式?

除了三大范式外,还有BC范式第四范式,但其规范过于严苛,在生产中往往使用不到。

什么是范式和反范式,以及各自优缺点?

范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。

名称优点缺点
范式范式化的表减少了数据冗余,数据表更新操作快、占用存储空间少。查询时通常需要多表关联查询,更难进行索引优化
反范式反范式的过程就是通过冗余数据来提高查询性能,可以减少表关联和更好进行索引优化存在大量冗余数据,并且数据的维护成本更高

所以在平时工作中,我们通常是将范式和反范式相互结合使用。

二、索引

首先了解一下什么是索引,索引是对数据库表中一列或多列的值进行排序的数据结构,用于快速访问数据库表中的特定信息。

索引的几种类型或分类?

物理结构上可以分为聚集索引和非聚集索引两类。

  • 聚簇索引指索引的键值的逻辑顺序与表中相应行的物理顺序一致,即每张表只能有一个聚簇索引,也就是我们常说的主键索引

  • 非聚簇索引的逻辑顺序则与数据行的物理顺序不一致

应用上可以划分为一下几类:

  • 普通索引:MySQL 中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了提高查询效率。通过 ALTER TABLE table_name ADD INDEX index_name (column) 创建。

  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值。通过 ALTER TABLE table_name ADD UNIQUE index_name (column) 创建。

  • 主键索引:特殊的唯一索引,也成聚簇索引,不允许有空值,并由数据库帮我们自动创建。

  • 组合索引:组合表中多个字段创建的索引,遵守最左前缀匹配规则。

  • 全文索引:只有在 MyISAM 引擎上才能使用,同时只支持 CHAR、VARCHAR、TEXT 类型字段上使用。

ref:索引的类型分类、区别、优缺点

索引的优缺点?

先来说说优点:创建索引可以大大提高系统的性能。

1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

既然增加索引有如此多的优点,为什么不对表中的每一个列都创建一个索引呢?这是因为索引也是有缺点的:

1)创建和维护索引需要耗费时间,这种时间随着数据量的增加而增加,这样就降低了数据的维护速度。

2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。

索引设计原则?

1)选择唯一性索引

ref:MySQL索引的设计原则

索引的数据结构?

索引的数据结构和具体存储引擎的实现有关,MySQL 中常用的是 Hash 和 B+ 树索引。

Hash 索引底层就是 Hash 表,进行查询时调用 Hash 函数获取到相应的键值(对应地址),然后回表查询获得实际数据.

B+ 树索引底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节点方可以获得所查键值,最后查询判断是否需要回表查询.

Hash 和 B+ 树索引的区别?

Hash
1)Hash 进行等值查询更快,但无法进行范围查询。因为经过 Hash 函数建立索引之后,索引的顺序与原顺序无法保持一致,故不能支持范围查询。同理,也不支持使用索引进行排序。

2)Hash 不支持模糊查询以及多列索引的最左前缀匹配,因为 Hash 函数的值不可预测,如 AA 和 AB 的算出的值没有相关性。

3)Hash 任何时候都避免不了回表查询数据.

4)虽然在等值上查询效率高,但性能不稳定,因为当某个键值存在大量重复时,产生 Hash 碰撞,此时查询效率反而可能降低。

B+ Tree

1)B+ 树本质是一棵查找树,自然支持范围查询和排序。

2)在符合某些条件(聚簇索引、覆盖索引等)时候可以只通过索引完成查询,不需要回表。

3)查询效率比较稳定,因为每次查询都是从根节点到叶子节点,且为树的高度。

ref:Hash索引和B+树索引有什么区别或者说优劣势

为何使用 B+ 树而非 B 树做索引?

ref 为什么 B+ 树比 B 树更适合应用于数据库索引?

什么是最左匹配原则?

顾名思义,最左优先,以最左边为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。

如建立 (a,b,c,d) 索引,查询条件 b = 2 是匹配不到索引的,但是如果查询条件是 a = 1 and b = 2a=1 又或 b = 2 and a = 1 就可以,因为优化器会自动调整 a,b 的顺序。

再比如 a = 1 and b = 2 and c > 3 and d = 4,其中 d 是用不到索引的,因为 c 是一个范围查询,它之后的字段会停止匹配。

最左匹配的原理

上图可以看出 a 是有顺序的(1、1、2、2、3、3),而 b 的值是没有顺序的(1、2、1、4、1、2)。所以 b = 2 这种查询条件无法利用索引。

同时我们还可以发现在 a 值相等的情况下(a = 1),b 又是顺序排列的,所以最左匹配原则遇上范围查询就会停止,剩下的字段都无法使用索引。

ref 最左匹配原则

什么是覆盖索引?

在 B+ 树的索引中,叶子节点可能存储了当前的键值,也可能存储了当前的键值以及整行的数据,这就是聚簇索引和非聚簇索引。 在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。

当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。

什么是索引下推?

ref Mysql性能优化:什么是索引下推?

三、存储

存储引擎

有哪些常见的存储引擎?

ref 几种MySQL数据库引擎优缺点对比

MyISAM 和 InnoDB 的区别?

1)InnoDB 支持事务,而 MyISAM 不支持。

2)InnoDB 支持外键,而 MyISAM 不支持。因此将一个含有外键的 InnoDB 表 转为 MyISAM 表会失败。

3)InnoDB 和 MyISAM 均支持 B+ Tree 数据结构的索引。但 InnoDB 是聚集索引,而 MyISAM 是非聚集索引。

4)InnoDB 不保存表中数据行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量记录了整个表的行数,速度相当快(注意不能有 WHERE 子句)。

那为什么 InnoDB 没有使用这样的变量呢?因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的。

5)InnoDB 支持表、行(默认)级锁,而 MyISAM 支持表级锁。

InnoDB 的行锁是基于索引实现的,而不是物理行记录上。即访问如果没有命中索引,则也无法使用行锁,将要退化为表锁。

6)InnoDB 必须有唯一索引(如主键),如果没有指定,就会自动寻找或生产一个隐藏列 Row_id 来充当默认主键,而 Myisam 可以没有主键。

ref MyISAM与InnoDB 的区别(9个不同点)

InnoDB 的四大特性?

  • 插入缓冲insert buffer)
  • 二次写(double write)
  • 自适应哈希索引(ahi)
  • 预读(read ahead)

InnoDB 为何推荐使用自增主键?

自增 ID 可以保证每次插入时 B+ 树索引是从右边扩展的,因此相比自定义 ID (如 UUID)可以避免 B+ 树的频繁合并和分裂。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。

如何选择存储引擎?

默认使用 InnoDB,MyISAM 适用以插入为主的程序,比如博客系统、新闻门户。

存储结构

ref MySQL之InnoDB物理存储结构

四、事务

什么是数据库的事务?

数据库的事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的典型应用场景,如转账。

什么是事务的四大特性(ACID)?

  • 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用
  • 一致性: 事务执行前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
  • 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
  • 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

ref 事务ACID理解

事务的并发问题?

脏读、幻读和不可重复度。

ref 并发事务带来的问题

什么是脏读、幻读和不可重复度?

  • 脏读: 事务 A 读取事务 B 更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  • 不可重复读: 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  • 幻读: 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

ref MySQL的四种事务隔离级别

什么是事务的隔离级别?

串行化的隔离级别最高,读未提交的级别最低,级别越高,则执行效率就越低,所以在选择隔离级别时应该结合实际情况。

MySQL 支持以上四种隔离级别,默认为 Repeatable read (可重复读);而 Oracle 只支持 Serializeble(串行化) 级别和 Read committed(读已提交) 两种,其中默认为读已提交。

ref 事务的隔离级别

ACID 特性是如何实现的?

分四个维度去理解,如原子性是 undo 日志,持久性是 redo 日志。(PS 日志具体原理在后续章节讲述。)

ref ACID特性的实现原理

五、锁

数据库锁的作用以及有哪些锁?

当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。即锁的作用是解决并发问题。

从锁的粒度划分,可以将锁分为表锁、行锁以及页锁。

  • 行级锁:是锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。

行级锁开销大,加锁慢,且会出现死锁。但锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  • 表级锁:是粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。

  • 页级锁:是粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录。

开销和加锁时间界于表锁和行锁之间,会出现死锁。锁定粒度界于表锁和行锁之间,并发度一般。

从使用性质划分,可以分为共享锁、排它锁以及更新锁。

  • 共享锁(Share Lock):S 锁,又称读锁,用于所有的只读数据操作。

S 锁并非独占,允许多个并发事务对同一资源加锁,但加 S 锁的同时不允许加 X 锁,即资源不能被修改。S 锁通常读取结束后立即释放,无需等待事务结束。

  • 排他锁(Exclusive Lock):X 锁,又称写锁,表示对数据进行写操作。

X 锁仅允许一个事务对同一资源加锁,且直到事务结束才释放,其他任何事务必须等到 X 锁被释放才能对该页进行访问。

使用 select * from table_name for update; 语句产生 X 锁。

  • 更新锁:U 锁,用来预定要对资源施加 X 锁,允许其他事务读,但不允许再施加 U 锁或 X 锁。

当被读取的页将要被更新时,则升级为 X 锁,U 锁一直到事务结束时才能被释放。故 U 锁用来避免使用共享锁造成的死锁现象。

ref 数据库锁分类和总结

从主观上划分,又可以分为乐观锁和悲观锁。

  • 乐观锁(Optimistic Lock):顾名思义,从主观上认定资源是不会被修改的,所以不加锁读取数据,仅当更新时用版本号机制等确认资源是否被修改。

乐观锁适用于多读的应用类型,可以系统提高吞吐量。

  • 悲观锁(Pessimistic Lock):正如其名,具有强烈的独占和排它特性,每次读取数据时都会认为会被其它事务修改,所以每次操作都需要加上锁。

隔离级别和锁的关系?

1)在 Read Uncommitted 级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突;

2)在 Read Committed 级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

3)在 Repeatable Read 级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁;

4)在 SERIALIZABLE 级别下,限制性最强,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

InnoDB 中的锁算法?

  • Record lock:单个行记录上的锁
  • Gap lock:间隙锁,锁定一个范围,不包括记录本身
  • Next-key lock:record + gap 锁定一个范围,包含记录本身

ref 锁机制与InnoDB锁算法

####什么是 MVCC 以及原理?

MVCC 的英文全称是 Multiversion Concurrency Control,中文意思是多版本并发控制技术。

其原理是通过数据行的多个版本管理来实现数据库的并发控制,简单来说就是保存数据的历史版本。可以通过比较版本号决定数据是否显示出来。读取数据的时候不需要加锁可以保证事务的隔离效果。

ref MVCC 原理

六、进阶功能

视图

存储过程

什么是存储过程?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。

存储过程和函数的区别?

1)返回值的区别:函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有。

2)调用的区别:,函数可以在查询语句中直接调用,而存储过程必须单独调用。

ref 存储过程(procedure)和函数(Function)的区别

触发器

七、集群

日志

MySQL 中有哪些常见日志?

  • 重做日志(redo log):物理日志

作用是确保事务的持久性。 redo 日志记录事务执行后的状态,用来恢复未写入 data file 的已提交事务数据。

  • 回滚日志(undo log):逻辑日志

作用是保证数据的原子性。 保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。

  • 二进制日志(binlog):逻辑日志

常用于主从同步或数据同步中,也可用于数据库基于时间点的还原。

  • 错误日志(errorlog)

记录着 MySQL 启动和停止,以及服务器在运行过程中发生的错误的相关信息。在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。

  • 普通查询日志(general query log)

记录了服务器接收到的每一个命令,无论命令语句是否正确,因此会带来不小开销,所以也是默认关闭的。

  • 慢查询日志(slow query log)

记录执行时间过长和没有使用索引的查询语句(默认 10s),同时只会记录执行成功的语句。

  • 中继日志(relay log)

在从节点中存储接收到的 binlog 日志内容,用于主从同步。

ref MySQL中的几种日志了解

主从复制

什么是主从复制?

主从复制是用来建立一个与主数据库完全一样的数据库环境,即从数据库。主数据库一般是准实时的业务数据库。

主从复制的作用?

  • 负载均衡
  • 读写分离
  • 高可用
  • 备份

主从复制的实现或原理?

ref MySQL主从复制面试之和原理

主从中常见问题以及解决?

问题
1)主库宕机后,数据可能丢失。

2)从库只有一个sql Thread,主库写压力大,复制很可能延时。

解决
1)半同步复制:确保事务提交后 binlog 至少传输到一个从库 ,解决数据丢失的问题。

2)并行复制:从库多线程apply binlog,解决从库复制延迟的问题。

八、SQL

语法

SQL 是一门 ANSI 标准计算机语言,用来访问和操作数据库系统。通常 SQL 语句可以分为两类:

  • 数据操作语言(DML):SELECT、DELETE、INSERT INTO、UPDATE
  • 数据定义语言(DDL):CREATE、DROP、ALTER

实践中,还有一种

  • 数据控制语言(Data Control Language):GRANT,REVOKE,COMMIT,ROLLBACK

常见的聚合查询?

使用聚合函数的查询就是聚合查询。所有的聚合函数(UDAF)都应该支持分组查询,内置的聚合函数有:

sum(列名) 求和      
max(列名) 最大值     
min(列名) 最小值     
avg(列名) 平均值     
first(列名)   第一条记录   
last(列名)    最后一条记录  
count(列名)   统计记录数   注意和count(*)的区别

ref SQL 聚合查询

几种关联查询?

1) 内连接(自然连接):只返回匹配的行,如 Inner Join、Union Join。

2)外连接:返回一个表的全集,如 Left、Right、Full 和 Cross。

ref SQL多表查询

Where 和 Having 的区别?

where 子句的作用是在对查询结果进行分组前,将不符合条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

总结一下条件的过滤顺序:on->join->where->group by->having

SQL 关键字的执行顺序?

ref SQL的执行顺序

In 和 Exists 的区别?

in 适合内表比外表数据小的情况,exists 适合内表比外表数据大的情况。如果查询的内外表大小相当,则二者效率差别不大。

ref SQL语句中exists和in的区别

Union 和 Union All 的区别?

  • Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序

  • Union All:对两个结果集进行并集操作,包括重复行,不进行排序

Union 因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All。

ref union和union all的区别

Drop、Delete 和 Truncate 的区别?

虽然通过 delete、truncate、drop 这三个关键字都可以用来删除数据,但场景不同。

从执行速度上讲:drop > truncate >> DELETE

区别DeleteTruncateDrop
SQL类型属于DML属于DDL属于DDL
支持回滚支持不支持不支持
删除内容表结构还在,删除表的全部或部分数据表结构还在,删除表中所有数据从数据库中删除表的所有数据,包括索引和权限
执行速度速度慢,需要逐行删除速度快速度最快

ref delete、truncate、drop的区别有哪些,该如何选择

优化

一条 SQL 是如何执行的?

ref sql执行过程

如何判断 SQL 是否走了索引?

EXPLAIN 命令是查看查询优化器如何决定执行查询的主要方法,使用 EXPLAIN 只需在查询语句开头增加 EXPLAIN 这个关键字即。

其结果中的几个重要参数:

  • id

ID 代表执行 select 子句或操作表的顺序,如果包含子查询,则会出现多个 ID。值越大,优先级越高,越先被执行。值相同的按照由上至下的顺序执行。

  • select_type(查询类型)

查询类型主要用于区别普通查询、联合查询以及子查询等复杂查询。

  • table

  • type

查询扫描情况,最好到最差依次是:system>const>eq_ref>ref>range>index>All,一般情况下至少保证达到 range 级别,最好能达到 ref。

  • possible_keys

显示可能应用在这张表中的索引,一个或多个。查询到的索引不一定是真正被使用。

  • key

实际使用的索引,如果为 null 则表示没有使用索引。因此会出现 possible_keys 列有可能被用到的索引,但是 key 列为 null。

  • key_len

表示索引中使用的字节数,在不损失精确性的情况下长度越短越好。key_len 显示的值为索引字段的最大可能长度,并非实际使用长度。即 key_len 是根据表定义计算而来。

  • ref

显示索引的哪一列被使用了,如果可能的话是一个常数,哪些列或常量被用于查找索引列上的值。

  • rows

根据表统计信息及索引选用情况,估算出找到所需的记录所需要读取的行数。

  • Extra

ref EXPLAIN的参数解析及简单应用

索引失效的几种情况?

1)like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效;

2)or 语句前后没有同时使用索引。当 or 左右查询字段只有一个是索引,该索引失效,只有左右查询字段均为索引时,才会生效;

3)联合索引不使用第一列,索引失效;

4)数据类型出现隐式转化。如 varchar 不加单引号的话可能会自动转换为 int 型,使索引无效,产生全表扫描;

5)在索引列上使用 IS NULL 或 IS NOT NULL操作。最好给列设置默认值。

6)在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。

7)对索引字段进行计算操作、字段上使用函数。

8)当 MySQL 觉得全表扫描更快时(数据少);

ref Mysql索引查询失效的情况

Where 子句如何优化?

超大分页或深度分页如何处理?

说道 MySQL 的分页,我们首先想到的就是 offset、limit 操作,但随着页数的增加,查询性能指数级增大。

这是由于 MySQL 并不是跳过 offset 的行数,而是取 offset + limit 行,然后丢弃前 offset 行,返回 limit 行,当offset特别大的时候,效率就非常的低下。

此处我们就可以采用覆盖索引+延迟关联技术来减少偏移量的定位进行优化:

##查询语句
select id from product limit 10000000, 10
##优化方式一
SELECT * FROM product WHERE ID > =(select id from product limit 10000000, 1) limit 10
##优化方式二
SELECT * FROM product a JOIN (select id from product limit 10000000, 10) b ON a.ID = b.id

ref mysql优化:覆盖索引(延迟关联)

大表查询如何优化?

可以从分库分表、读写分离以及缓存三个维度分别阐述。

实践

几种常见名次问题

ref MySQL排名函数实现

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:14:25  更:2022-02-14 21:14:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:09:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码