一线大厂面试的MySQL索引夺命连环15问( 三 )


因此,MySQL5.6版本之后,选出包含“小”字后,顺表过滤age=28

一线大厂面试的MySQL索引夺命连环15问

文章插图
11. 大表如何添加索引
如果一张表数据量级是千万级别以上的,那么,如何给这张表添加索引?
我们需要知道一点,给表添加索引的时候,是会对表加锁的 。如果不谨慎操作,有可能出现生产事故的 。可以参考以下方法:
(1)先创建一张跟原表A数据结构相同的新表B 。
(2)在新表B添加需要加上的新索引 。
(3)把原表A数据导到新表B
(4)rename新表B为原表的表名A,原表A换别的表名;
12. 如何知道语句是否走索引查询?
explain查看SQL的执行计划,这样就知道是否命中索引了 。
当explain与SQL一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息 。
一线大厂面试的MySQL索引夺命连环15问

文章插图
一般来说,我们需要重点关注type、rows、filtered、extra、key 。
1.2.1 type
type表示连接类型,查看索引执行情况的一个重要指标 。以下性能从好到坏依次:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • system:这种类型要求数据库表中只有一条数据,是const类型的一个特例,一般情况下是不会出现的 。
  • const:通过一次索引就能找到数据,一般用于主键或唯一索引作为条件,这类扫描效率极高,,速度非常快 。
  • eq_ref:常用于主键或唯一索引扫描,一般指使用主键的关联查询
  • ref : 常用于非主键和唯一索引扫描 。
  • ref_or_null:这种连接类型类似于ref,区别在于MySQL会额外搜索包含NULL值的行
  • index_merge:使用了索引合并优化方法,查询使用了两个以上的索引 。
  • unique_subquery:类似于eq_ref,条件用了in子查询
  • index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值 。
  • range:常用于范围查询,比如:between ... and 或 In 等操作
  • index:全索引扫描
  • ALL:全表扫描
1.2.2 rows
该列表示MySQL估算要找到我们所需的记录,需要读取的行数 。对于InnoDB表,此数字是估计值,并非一定是个准确值 。
1.2.3 filtered
该列是一个百分比的值,表里符合条件的记录数的百分比 。简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例 。
1.2.4 extra
该字段包含有关MySQL如何解析查询的其他信息,它一般会出现这几个值:
  • Using filesort:表示按文件排序,一般是在指定的排序和索引排序不一致的情况才会出现 。一般见于order by语句
  • Using index :表示是否用了覆盖索引 。
  • Using temporary: 表示是否使用了临时表,性能特别差,需要重点优化 。一般多见于group by语句,或者union语句 。
  • Using where : 表示使用了where条件过滤.
  • Using index condition:MySQL5.6之后新增的索引下推 。在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据减少回表的数据 。
1.2.5 key
该列表示实际用到的索引 。一般配合possible_keys列一起看 。
13.Hash 索引和 B+树区别是什么?你在设计索引是怎么抉择的?
  • B+树可以进行范围查询,Hash 索引不能 。
  • B+树支持联合索引的最左侧原则,Hash 索引不支持 。
  • B+树支持 order by 排序,Hash 索引不支持 。
  • Hash 索引在等值查询上比 B+树效率更高 。(但是索引列的重复值很多的话,Hash冲突,效率降低) 。
  • B+树使用 like 进行模糊查询的时候,like 后面(比如%开头)的话可以起到优化的作用,Hash 索引根本无法进行模糊查询 。
14. 索引有哪些优缺点?
优点:
  • 索引可以加快数据查询速度,减少查询时间
  • 唯一索引可以保证数据库表中每一行的数据的唯一性
缺点:
  • 创建索引和维护索引要耗费时间
  • 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间
  • 以表中的数据进行增、删、改的时候,索引也要动态的维护 。
15. 聚簇索引与非聚簇索引的区别
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式 。它表示索引结构和数据一起存放的索引 。非聚集索引是索引结构和数据分开存放的索引 。
【一线大厂面试的MySQL索引夺命连环15问】


推荐阅读