目录

  • ?? 一,什么是索引
  • ??二,索引的作用
  • ??三,索引优缺点及场景
    • 1,优点
    • 2,缺点
    • 3,使用场景
    • 4,注意事项
  • ??四,索引的使用
    • 1,索引分类
    • 2,查看索引
    • 3,创建索引(重点)
    • 4,索引和约束的区别(容易混淆)
  • ??五,索引实现原理-索引失效
    • 2,实现原理
      • (1)二叉树阶段
      • (2)B树阶段
      • (3)B+树阶段
    • 2,索引失效场景(面试常考)
      • (1)联合索引不满足最左匹配原则(前缀匹配原则)
      • (2)使用错误的模糊查询
      • (3)列使用运算操作(±*/)
      • (4)列使用函数
      • (5)列存在类型转换
      • (6)使用is not null
  • ?? 六,常见面试题
    • 1.聚簇索引和二级索引的区别
    • 2,MySQL InnoDB 为什么设计B+树,而不是B树,Hash,二叉树,红黑树?
    • 3,什么是MySQL的最左前缀原则
    • 4, 事务ACID的特性
    • 5,索引失效场景有哪些

?? 一,什么是索引

索引是一种特殊的文件,它包含了数据表中所有记录的引用指针,我们可以对列或多列创建索引并且指定对应的类型,每种类型有对应的数据结构去实现

MySQL 数据库有很多引擎,MySQL 和引擎的关系就像汽商和汽型的关系,个商
(MySQL)可以有多种型(多个引擎)。
MySQL 最著名的引擎有两个:InnoDB 和 MyISAM,MyISAM 是 MySQL 5.5 之前默认的引擎,
MySQL 5.5 之后的默认引擎是 InnoDB,它们最的区别是 MyISAM 不持事务,所以有很的数据不
完整性险(也就是数据的业务执了半), InnDB 持事务,但 MyISAM 的性能 InnoDB ,
然对于使者来说牺牲些性能换取更的稳定性是常明智的选择

??二,索引的作用

数据库中数据存储在磁盘,磁盘的顺序查询速度是很慢的,所以的顺序查找指的是读取磁盘中的数据条条的进查找。
索引就是为了避免顺序查询,提供查询速度的。
查询数据存储的目录:show variables like ‘%dir%’;

索引的作用

在数据库中表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。索引所起的作用类似书籍目录,可用于快速定位、检索数据。
索引对于提高数据库的性能有很大的帮助

??三,索引优缺点及场景

1,优点

我们为什么要创建索引呢,因为创建索引可以提高系统的性能,具体体现在以下几个方面:
(1)通过创建唯一索引时,可以确保每一行数据的唯一性
(2)当创建索引后,可以大大提高检索的速度,同时在分组和对数据排序后使用索引,可以减少排序和分组的时间
(3)在表和表之间连接时,在保证数据的完整性有很大作用, 另外通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

2,缺点

到现在所讨论的都是索引的优点,其实索引也有缺点,比如
(1)索引创建后,它的维护成本很高,因为它所使用的是B+树,每次在添加删除时,都会整理树结构,将这些操作写入到索引文件中
(2)索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件
(3)创建过多的索引,对优化器也会造成很多负担

3,使用场景

当了解完索引的优缺点后,不得不去考虑索引的使用场景,要注意下面两点:
(1)当数据库中的数据量比较大时,可以创建
(2)创建索引去查询经常用到的列
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。

4,注意事项

(1)索引会占用额外的磁盘空间,或磁盘空间不足时,不考虑创建索引,如果是不常使用的列,或经常做插入、修改操作的列,不适合加索引
(2)不要在线上环境去创建索引,也就是再有用户在使用此系统时,创建索引会锁表,线上数量大会导致其他所有接口不可用,导致系统性崩溃

??四,索引的使用

1,索引分类

(1)主键索引:(聚簇/集索引)种特殊的唯索引,不允许有空值,般是在建表的时候同时创建主键
索引(通过 primary key)
(2)非主键索引:(二级索引)除了主键索引之外的索引
(3)唯一索引:不能重复的索引,也就是唯一的
(4)普通索引:可以重复也可以为null的索引,外键索引也是
(5)联合索引:多个字段的普通索引组成的索引

2,查看索引

查看索引语法:

show index from 表名;
案例:查询学生表是索引:
show index from student;

3,创建索引(重点)

在创建主键 primary key/unique/foreign key 时会自动创建索引,而对于非主键、非唯约束、非外键的字段,可以手动创建索引
例如:有个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引

create table T(
id int primary key,
k int not null,
name varchar(16),
index (k)
);

(1)添加主键索引

语法
alter table table_name add primary key (id);


(2)添加唯一索引

语法
create unique index 索引名 on 表名(字段名);


(3)添加普通索引

语法
create index 索引名 on 表名(字段名[,字段名2…]);

(4)删除索引

语法
drop index 索引名 on 表名;

4,索引和约束的区别(容易混淆)

(1)定义和作用不同:约束是保证数据的可靠性的;索引是加速查询的,不是回事
(2)可以相互创建:当创建了主键、外键、唯约束也就创建了相应的索引;当创建了唯索引,也就
创建了唯约束

??五,索引实现原理-索引失效

2,实现原理

(1)二叉树阶段

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高,多叉树是在二分查找树的基础上,增加单个节点的数据存储数量,同时增加了树的子节点数,一次计算可以把查找范围缩小更多

(2)B树阶段

B-tree 已经大大改进了树家族的性能,它把多个数据集中存储在一个节点中,本身就可能减少了 I/O 次数或者寻道次数。
但是仍然有一个致命的缺陷,那就是它的索引数据与业务绑定在一块,而业务数据的大小很有可能远远超过了索引数据,这会大大减小一次 I/O 有用数据的获取,间接的增加 I/O 次数去获取有用的索引数据。

(3)B+树阶段

B+ 树中,非叶子节点只保存索引数据,叶子节点保存索引数据与业务数据。这样即保证了叶子节点的简约干净,数据量大大减小,又保证了最终能查到对应的业务数。既提高了单次 I/O 数据的有效性,又减少了 I/O 次数,还实现了业务。

2,索引失效场景(面试常考)

(1)联合索引不满足最左匹配原则(前缀匹配原则)

在联合索引查询时,查询语句必须要从联合索引最左侧开始查询,联合查询才能生效,否则失效
比如联合查询为A+B+C
当B+C不符合最左匹配原则,索引就会失效

(2)使用错误的模糊查询

当使用了错误的模糊查询
like的模糊查询方式
①前面确定 -> 字段名 like ‘张%’ 才可以触发有效索引
②中间确定 -> 字段名 like ‘%张’
③后面确定 -> 字段名 like ‘张%’

(3)列使用运算操作(±*/)

(4)列使用函数

(5)列存在类型转换

(6)使用is not null

?? 六,常见面试题

1.聚簇索引和二级索引的区别

聚簇索引存储的是行数据,也就是对应的地址,只要查到相对应的id,就可以查到主键对应的行数据,但二级索引中非叶子节点存储的是二级索引的值,叶子节点存储的是主键id
1, 执行效率:聚簇索引查询速度更快,因为聚簇索引存储的是数据,而非聚簇索引存储的是主键 ID,需要进回表查询,性能低
2,数量上:聚簇索引个表只能有个,聚簇索引可以有多个

2,MySQL InnoDB 为什么设计B+树,而不是B树,Hash,二叉树,红黑树?

(1)哈希索引能够以 O(1) 的速度处理单个数据行的增删改查,但是面对范围查询或者排序时就会导致全表扫描的结果。
(2)B树可以在非叶结点中存储数据,由于所有的节点都可能包含目标数据,我们总是要从根节点向下遍历子树查找满足条件的数据行,这个特点带来了大量的随机 I/O,造成性能下降。
(3)B+树所有的数据行都存储在叶节点中,而这些叶节点可以通过指针依次按顺序连接,当我们在如下所示的 B+ 树遍历数据时可以直接在多个子节点之间进行跳转,这样能够节省大量的磁盘 I/O 时间。
(4)二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。红黑树:树的高度随着数据量增加而增加,IO代价高。

3,什么是MySQL的最左前缀原则

(1)最左前缀原则就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4
(1) 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
(3)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,MySQL的查询优化器会帮你优化成索引可以识别的形式。

4, 事务ACID的特性

(1) 原子性:又称不可分割性,事务里所有的操作要么全部成功,要么全部失败原子性是事务最重要的特性,全部执行失败并不是不执行,而是通过逆操作 rollback(回滚)数据。
实现原理:回滚是逆 SQL 操作
(2)持久性:当时事务执行后,MySQL中的数据是持久的,不会因为事务的进行而改变
(3)隔离性:当有很多事务并发进行时,事务之间是互相不影响的,又称为独立性
(4)一致性:事务在执行前后都会保持一种合法的状态,从一种状态到另一种状态

5,索引失效场景有哪些

(1)当联合索引不满足最左匹配原则,相当于创建多列索引,没有最左优先,那么联合查询也就失效,
(2)在查询时,使用错误的模糊查询
(3)当列使用运算操作和函数时,索引就失效了
(4)列使用了类型转换,也会导致索引失效
(5)使用了is not null,那么索引就会失效

数据库MySQL-索引(含常见面试题)相关推荐

  1. MySQL索引及常见面试题

    一.索引是什么? 索引(Index)是帮助 MySQL 高效获取数据的数据结构,是对表中一列或多列值进行排序的结构. 就比如索引是一本书的目录,可以通过目录快速查找自己想要查询的东西. 二.索引为什么 ...

  2. 2020最新Java面试题(java,JavaWeb,数据库,框架),常见面试题及答案汇总

    1.面试题模块汇总 面试题包括以下十九个模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/S ...

  3. HTTP协议与HTTPS协议详解(含常见面试题)

    目录 1.HTTP协议 1.1HTTP协议是什么 1.2 HTTP协议工作过程 1.3 HTTP请求方法 1.4.HTTP请求报文和应答报文 1.5 HTTP状态码 2.HTTPS协议 2.1.什么是 ...

  4. 测试分类方法(含常见面试题)

    目录 一.测试分类依据 1.按开发阶段分 2.按测试实施组织分 3.按测试执行方式分 4.按是否查看代码分 5.按是否手动执行 6.按测试对象分 7.按测试地域分 二.常见面试题 1.谈一下白盒测试和 ...

  5. 数据库常见面试题——索引

    如何设计一个关系型数据库 索引模块 为什么要使用索引 快速查询数据 什么样的信息能够成为索引 主键.唯一键以及普通键等 索引的数据结构 生成索引,建立二叉查找树进行二分查找树(平衡二叉树.红黑树) 生 ...

  6. Mybatis常见面试题总结(详细)

    Mybatis常见面试题总结 SpringMVC常见面试题总结(超详细回答) 2020最新Java面试题(java,JavaWeb,数据库,框架),常见面试题及答案汇总 Spring常见面试题总结(超 ...

  7. 【MySQL】索引常见面试题

    文章目录 索引常见面试题 什么是索引 索引的分类 什么时候需要 / 不需要创建索引? 有什么优化索引的方法? 从数据页的角度看B + 树 InnoDB是如何存储数据的? B + 树是如何进行查询的? ...

  8. 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈 ...

  9. MySQL数据库常见面试题总结

    1.数据库的常用范式: 第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值: 第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必 ...

最新文章

  1. iOS UIView成像流程
  2. 【java】itoo项目实战之hibernate 懒载入优化性能
  3. sklearn快速入门教程:(四)模型自动调参
  4. 彻底吃透Web服务器、容器、应用程序服务器与反向代理
  5. (Microsoft) Visual Studio LightSwitch
  6. IBM推新编码系统 实现高清视频技术大突破
  7. 解说linux下proc文件系统
  8. java简单模拟实现数据库连接池
  9. 人工智能学习-传教士-15数码-拟合-逻辑推理
  10. Java实现阿里云域名动态解析,DDNS功能
  11. 用PYTHON优化投资组合的配置
  12. cad如何打开stp文件_用cad怎么打开stp格式文件
  13. 在线Json格式化、在线格式化Json代码、Json代码美化器、Json在线压缩、Json \uxxxx格式解码
  14. 利用燕尾花数据集画出P-R曲线
  15. IntelliJ IDEA 快捷键大全
  16. 物联网考计算机是跨专业,2014考研计算机等专业 加入物联网技术方向_跨考网
  17. Netcraft中国SSL市场份额统计,沃通WoSign跃居第二
  18. 求日版KPW2的内核文件main_kernel.img和diags_kernel.img
  19. 【图像加密】基于小波变换结合混沌算法实现图像加密解密含Matlab源码
  20. 你还在手写sql吗? MyBatis 逆向工程使用 使用逆向工程生成实体类,超级好用的生成实体类与mapper

热门文章

  1. 用Google Assistant 的Trivia模板创建一款益智问答游戏
  2. 三方支付助手-银行卡识别
  3. 【游戏逆向】检测加速辅助案例分析
  4. 关于ASO优化错误做法的归纳
  5. Java中接口和抽象类的区别
  6. android仿制应用宝的应用详情页
  7. 反编译linux内核 kmem,Volatility学习笔记一:使用手册
  8. 安装Windows 10 到VHDX
  9. 基于神经网络的二分类问题
  10. python win32编程