MySql知识体系总结(2021版,springcloud高级面试题

InnoDB: 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、CRUD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

11、 外键

MyISAM:不支持

InnoDB:支持

三、sql优化简介


1、什么情况下进行sql优化

性能低、执行时间太长、等待时间太长、连接查询、索引失效。

2、sql语句执行过程

(1)编写过程


select distinct ... from ... join ... on ... where ... group by ... having ... order by ... limit ...

(2)解析过程


from ... on ... join ... where ... group by ... having ... select distinct ... order by ... limit ...

3、sql优化就是优化索引

索引相当于书的目录。

索引的数据结构是B+树。

四、索引


1、索引的优势

(1)提高查询效率(降低IO使用率)

(2)降低CPU使用率

比如查询order by age desc,因为B+索引树本身就是排好序的,所以再查询如果触发索引,就不用再重新查询了。

2、索引的弊端

(1)索引本身很大,可以存放在内存或硬盘上,通常存储在硬盘上。

(2)索引不是所有情况都使用,比如①少量数据②频繁变化的字段③很少使用的字段

(3)索引会降低增删改的效率

3、索引的分类

(1)单值索引

(2)唯一索引

(3)联合索引

(4)主键索引

备注:唯一索引和主键索引唯一的区别:主键索引不能为null

4、创建索引


alter table user add INDEX `user_index_username_password` (`username`,`password`)

5、MySQL索引原理 -> B+树

MySQL索引的底层数据结构是B+树

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

B-Tree结构图中每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

B+Tree相对于B-Tree有几点不同:

非叶子节点只存储键值信息。

所有叶子节点之间都有一个链指针。

数据记录都存放在叶子节点中。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗3)。也就是说一个深度为3的B+Tree索引可以维护103 * 10^3 * 10^3 = 10亿 条记录。

实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在24层。MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要13次磁盘I/O操作。

数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。

五、如何触发联合索引


1、对user表建立联合索引username、password

2、触发联合索引

(1)使用联合索引的全部索引键可触发联合索引

(2)使用联合索引的全部索引键,但是用or连接的,不可触发联合索引

(3)单独使用联合索引的左边第一个字段时,可触发联合索引

(4)单独使用联合索引的其它字段时,不可触发联合索引

六、分析sql的执行计划—explain


explain可以模拟sql优化执行sql语句。

1、explan使用简介

(1)用户表

(2)部门表

(3)未触发索引

(4)触发索引

(5)结果分析

explain中第一行出现的表是驱动表。

  1. 指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]

  2. 未指定联接条件时,行数少的表为[驱动表]

对驱动表直接进行排序就会触发索引,对非驱动表进行排序不会触发索引。

2、explain查询结果简介

(1)id:SELECT识别符。这是SELECT的查询序列号。

(2)select_type:SELECT类型:

  1. SIMPLE: 简单SELECT(不使用UNION或子查询)

  2. PRIMARY: 最外面的SELECT

  3. UNION:UNION中的第二个或后面的SELECT语句

  4. DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

  5. UNION RESULT:UNION的结果

  6. SUBQUERY:子查询中的第一个SELECT

  7. DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

  8. DERIVED:导出表的SELECT(FROM子句的子查询)

(3)table:表名

(4)type:联接类型

  1. system:表仅有一行(=系统表)。这是const联接类型的一个特例。

  2. const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。

  3. eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值