一、说下 MySQL 的 redo log 和 binlog?
#每天一道面试题# 35
#悟空拧螺丝# 2021-08-16
(1)MySQL 分两层:Server 层和引擎层。区别如下:
Server 层:主要做的是 MySQL 功能层面的事情。Server 层也有自己的日志,称为 binlog(归档日志)
引擎层:负责存储相关的具体事宜。redo log 是 InnoDB 引擎特有的日志。
(2)redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
(3)redo log 是循环写的,空间固定会用完;
(4)binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
二、说说建立索引的优势、负面影响和原则?
#每天一道面试题# 37
#悟空拧螺丝# 2021-08-18
(1)索引的优势? 检索速度:快速访问数据表中的特定信息,提高检索速度。 唯一性:创建唯一性索引,保证数据库表中每一行数据的唯一性。 加速连接:加速表和表之间的连接。 减少分组和排序的时间:使用分组和排序进行数据检索时,可以显著减少查询中分组和排序的时间。
(2)索引的负面影响? 耗时:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加。 占空间:索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间。 维护速度:当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
(3)为数据表建立索引的原则有哪些? 在最频繁使用的、用以缩小查询范围的字段上建立索引。 在频繁使用的、需要排序的字段上建立索引。
(4)什么情况下不适合建立索引? 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)。
三、说下 MySQL中的索引有哪些分类?
#每天一道面试题# 40
#悟空拧螺丝# 2021-08-21
MySQL的所有列类型都可以被索引。
MyISASM和InnoDB类型的表默认创建的都是BTREE索引;
MySQL中的索引是在存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。
MySQL目前提供了以下几种索引。
1)BTREE索引:最常见的索引类型,大部分引擎都支持BTREE索引,例如MyISASM、InnoDB、MEMORY等。
2)HASH索引:只有MEMORY和NDB引擎支持,适用于简单场景。
3)RTREE索引(空间索引):空间索引是MylSAM的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。
4)FULLTEXT(全文索引):全文索引也是MylSAM的一个特殊索引类型,主要用于全文索引,InnoDB从MySQL 5.6版本开始提供对全文索引的支持。
四、说下使用索引的推荐原则有哪些?
#每天一道面试题# 41
#悟空拧螺丝# 2021-08-22
(1)最适合索引的列是出现在WHERE子句中的列,或连接子句中指定的列,而不是出现在SELECT关键字后的选择列表中的列。 (2)使用唯一索引。唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。 (3)不要过度索引。因为每个索引都要占用额外的磁盘空间,并降低写操作的性能,增加维护成本。在修改表的内容时,索引必须进行更新,有时也可能需要重构,因此,索引越多,维护索引所花的时间也就越长。 (4)为经常需要排序、分组和联合操作的字段建立索引。 (5)删除不再使用或者很少使用的索引。 (6)利用最左原则。mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引; 如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引。 (7)使用短索引。
五、说下 MySQL 覆盖索引?
#每天一道面试题# 44
#悟空拧螺丝# 2021-08-26
概念: 如果一个索引包含(或者说覆盖了)所有满足查询所需要的数据,那么就称这类索引为覆盖索引(Covering Index)。在 MySQL 中,可以通过使用 explain 命令输出的 Extra 列来判断是否使用了索引覆盖查询。若使用了索引覆盖查询,则 Extra 列包含“Using index””字符串。
大白话解释: select 的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
优点: 1)覆盖索引能有效地提高查询性能,因为覆盖索引只需要读取索引而不需要再回表读取数据。MySQL查询优化器在执行查询前会判断是否有一个索引能执行覆盖查询。 2)索引项通常比记录要小,所以MySQL会访问更少的数据。
补充: 不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引。