面试笔记:MySQL索引基础知识必问包含了答案

249 阅读3分钟
MySQL面试常问的一些基础问题,希望对大家有所帮助。

Mysql索引类型

普通索引 唯一索引 主键索引 组合索引

 什么情况下索引失效 (必问)

索引什么时候不会生效,以下集中情况会导致索引失效:

1.条件中用or,即使其中有条件带索引,也不会使用索引查询(这就是查询尽量不要用or的原因,用in吧)


注意:使用or,又想索引生效,只能将or条件中的每个列都加上索引

2.对于多列索引,不是使用的第一部分,则不会使用索引。

3.like的模糊查询以%开头,索引失效


4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引

 B+Tree 和 hash 区别


一、BTree

BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量,例如:

select * from user where name like ‘jack%’

select * from user where name like ‘jac%k%’

如果一通配符开头,或者没有使用常量,则不会使用索引,例如:

select * from user where name like ‘%jack’

select * from user where name like simply_name

二、Hash

Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。 

 一条慢查询怎么优化 ,步骤是什么?

第一步 找到sql 第二步 explain 运行执行计划 分析结果

什么是覆盖索引?

 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。

 2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。

 3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用 

 4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询) 


 使用sql语句创建一个普通索引

(1)CREATE INDEX index_mytable_name ON mytable(name)
(2)ALTER TABLE mytable ADD INDEX index_mytable_name (name)

B+Tree 和 hash 区别 以下五点必须全部理解

1 如果是等值查询,那么哈希索引明显有绝对优势。

2 hash 不支持如果范围查询检索 因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索。

3 同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询)。

4 哈希索引也不支持多列联合索引的最左匹配规则;也就是说不支持联合索引查询。

5 在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。

点关注,不迷路;持续更新Java相关技术!

本文到这里就结束了,喜欢的朋友可以帮忙转发和关注一下,感谢支持!