MySQL面经(自总结口语化)

MySQL面经(自总结口语化)

1. MySQL的最左前缀匹配原则(从构建和查询开看)

因为MySQL的底层索引是B+树,有序的,在单键值索引匹配时,正常走B+树匹配,但在联合索引时,底层也是B+树,而构建一个B+树只能根据一个值来确定索引关系,所以数据库以来联合索引最左的字段来构建,先对左边第一个进行排序基础上再对第二个第三个,查询时从最左开始匹配。

2.MySQL去重的方法(3个)

  • distinct,select distinct column from table
  • group by,select 聚合函数(other colunm) from table group by column
  • row_number over(), SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

Partition by分组

3. 一条SQL语句再数据库框架中的执行流程

  • 读入,进行权限检查,连接检查等
  • 查询缓存,进入分析器,进行词法分析,语法分析,生成语法树
  • 进入优化器,进行查询优化,选择最优的路径
  • 调动接口,进行执行器完成查询,并在binlog中记录(如果是select可以不记录,其他对数据库增删改的会记录)
  • 进入执行引擎,innodb或myisam访问缓存或磁盘数据,对数据进行增删改

4. 数据库的三范式:

  • 第一范式:每个列都是原子,不可分割
  • 第二范式:数据库中每个列都与主键相关,不能只是主键的一部分有关
  • 第三范式:每一列都和主键直接相关,不能有依赖关系

5. char和varchar的区别

  • char是定长,varchar是可变长
  • char的存储长度就是数据的长度,varchar会分一或两个字节存储数据长度
  • char的字符长度为0-255一字节但是varchar多一些0-65535两字节
  • 如果前者设置char(10)那么当输入字符串未够10字节的时候会自动给他补够10,但是varchar可变会自适应

6. varchar(10)与varchar(20)的区别

限制长度不同,前者是10,后者是20,虽然硬盘上存储空间都是实际字符长度来分配存储空间的,但是对于内存来说,使用固定大小的内存块来保存,会先转char进行保存,那么在排序或者临时表或者查询时就会空间大,扫描久。

MySQL建立索引时假设没有限制索引的大小,索引长度会默认采用该字段的长度,varchar(20)的索引会比varchar(10)大。

7. 谈谈你对索引的理解

总的来说索引是加快数据访问,查询数据效率的。

MySQL是用B+树做索引的,当然别的数据库管理系统有用别的类型做索引,比如mongodb是用B树,也有别的用hashtable。从物理存储分类,聚簇索引和非聚簇索引,聚簇索引一般数据相关的会存储在一块,但是非聚簇索引存储数据就与物理位置无关。聚簇索引是有且只有一个的,非聚簇索引是可以多个也可以没有。

8. 谈谈你对B+树的理解

B+树是只在叶子节点上存储数据的,同时叶子节点上会多出指针指向兄弟叶子节点,有利于加速查询效率,方便范围查询等,可以减少回溯的次数,同时他是多叉树,所以树高会降低,查询的IO次数会减少。非叶子节点的大小是页大小,如果大于页大小,那就意味着搜索过程中,为了获取一个完整节点来查找数据可能会放在两页,如果需要多次IO来获取这个结点,那么就非常消耗时间,如果小于页大小,那么分叉就会少,总节点数就会变多深度变大,io次数也增加

9. 为什么Innodb存储引擎选用B+树而不是B树?

因为B树每个节点都会和值放在一起,同时叶子节点上面没有指向左右叶子节点的指针,范围查询的时候IO次数会因为回溯增加,不利于快速查询

10. 怎么知道创建的索引有没有用到?

explain select xxxx,看看结果,可以看到是走全表查询还是index,如果没有走index,可以查看表结构\d table,查看index有无建立成功,或者该字段有无索引

11. 什么情况下索引会失效?即查询不走索引?

  • 没有索引的时候,走不了索引
  • 表比较小,全表查询比索引快的时候走全表查询
  • Select like"%xxx"失效,因为是最左前缀匹配原则,第一个就是%那么就会无从下手
  • 索引字段做计算
  • 查询条件有or等
  • 太慢可能是因为执行的时候遇上了锁,如表锁,行锁等,或者本来这个sql就很慢

12. 查询性能的优化方法

  • 优化查询语句,减少or,优化子查询
  • 索引优化
  • 缓存重复查询的数据,减少对磁盘的访问,只返回必要的行,只返回必要的列,不要返回太多
  • 减少服务器扫描行数
  • 优化硬件
  • 优化一些特定的查询类型,如count等待

13. InnoDB 和 MyISAM 的比较?

  • Innodb支持事务,myisam不支持
  • lnnoDB存储引擎使用B+树,有聚簇索引,索引文件和数据文件绑定,MyISAM使用非聚簇索引,索引文件和数据文件分开存储,索引中保存的是数据文件的指针
  • Innodb查询速度慢过myisam因为它要保持数据一致性
  • Innodb支持外键,myisam不支持
  • Myisam的锁粒度只到了表锁,但是innodb允许表级锁和行级锁,并发处理能力高
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xin_L_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值