数据库⾯试简答、30道⾼频⾯试题⼀、MySQL问答
1、数据库sql语句查询,跨表查询有哪⼏种⽅式
内连接(inner可以不写)
这就是内连接,它要求数据必须On条件必须百分百匹配才会符合条件并返回。当不满⾜时,他会返回空。
外连接是⽤左\右侧的数据去关联另⼀侧的数据,即使关联不上任何数据也得把左\右侧的数据返回回来。
外连接分(左外连接)和(右外连接)
mysql面试题sql
左外连接( left join)
jupyter notebook运行的快捷键右外连接(right join--空值的会显⽰出来)
全外连接(full outer(可以不写) join--空值的会显⽰出来)
交叉连接(笛卡尔积)查询所有的值
2、数据库的索引⽤到的是什么数据结构?
答:B+树
问:那么B+树的特点是什么?为什么要⽤这个数据结构?
B+树是B树的变种,他们可以是 23树,234树,2345树等等,当单个节点允许伸出1200节点时,三层就可以有17亿,因此它体型扁平。。。有利益磁盘IO
B+树⾮叶⼦结点不存储数据,B树存储数据,所以相同⼤⼩数据块,能存更多B+索引
B+树叶⼦结点上有双向链表串联,有利于进⾏范围搜索
B+树为什么有利于磁盘IO?
⾸先了解⼀下计算机的空间局部性原理:当⼀个数据被⽤到时,其附近的数据也通常会马上被使⽤。即使只需要⼀个字节,磁盘也会从这个位置开始,顺序向后读取⼀定长度的数据放⼊内存。
使⽤红⿊树(平衡⼆叉树)结构的话,每次磁盘预读中的很多数据是⽤不上的数据。因此,它没能利⽤好磁盘预读的提供的数据。然后⼜由于深度⼤(较B树⽽⾔),所以进⾏的磁盘IO操作更多。
B树的每个节点可以存储多个关键字,它将节点⼤⼩设置为磁盘页的⼤⼩,充分利⽤了磁盘预读的功能。每次读取磁盘页时就会读取⼀整个节点。也正因每个节点存储着⾮常多个关键字,树的深度就会⾮常的⼩。进⽽要执⾏的磁盘读取操作次数就会⾮常少,更多的是在内存中对读取进来的数据进⾏查。
B树的查询,主要发⽣在内存中,⽽平衡⼆叉树的查询,则是发⽣在磁盘读取中。因此,虽然B树查询查询的次数不⽐平衡⼆叉树的次数少,但是相⽐起磁盘IO速度,内存中⽐较的耗时就可以忽略不计了。因此,B树更适合作为索引。
⽐B树更适合作为索引的结构是B+树。MySQL中也是使⽤B+树作为索引。它是B树的变种,因此是基于B树来改进的。为什么B+树会⽐B树更加优秀呢?
B树:有序数组+平衡多叉树。
B+树:有序数组链表+平衡多叉树。
B+树的关键字全部存放在叶⼦节点中,这样⾮叶⼦结点就能在相同的空间存储更多的信息,⾮叶⼦节点⽤来做索引,⽽叶⼦节点中有⼀个指针指向⼀下个叶⼦节点。做这个优化的⽬的是为了提⾼区间访问的性能。⽽正是这个特性决定了B+树更适合⽤来存储外部数据。
3、mylsam、innodb的区别
1.InnoDB和MyISAM都是B+数的结构。
2.InnoDB采⽤MVCC来⽀持⾼并发,并且实现了四个标准的隔离级别。其默认级别是REPETABLE READ (可重复读),并且通过间隙锁策略防⽌幻读的出现。
3.InnoDB表是基于聚簇索引建⽴的。
4.InnoDB⽀持事务。
5.InnoDB具有⾃动崩溃恢复功能。
6.InnoDB⽀持外键。
MyISAM
1.MyISAM 不⽀持事务和⾏级锁。
2.崩溃后⽆法安全恢复。
3.对于只读的数据,或者表⽐较⼩,可以忍受修复操作的可以使⽤。
4.MyISAM会将表存储在两个⽂件中,数据⽂件和索引⽂件,分别以.MYD和.MYI为扩展名。
5.MyISAM ⽀持全⽂索引。
4、MySQL的Gtid复制原理是什么?
mysql主从复制原理就是主库创建⼀个专门⽤于给从库拉取binlog的账号,并且给这个账号授权,让他可以拉取哪个DB的那个表的binlog,具体的授权SQL是:
Copy
这样从库就能登陆主库拉取binlog,那拉取binlog就得知道从哪个binlog的哪个位点拉取,现有的有两个⽅案:fileName + position 还有就是通过gtid⾃动点。
5、同步、半同步、异步复制原理是什么?
同步、半同步、异步复制说的是 从库在主库上拉取binlog⽇志的模式。
同步:
主库写redolog 事物处于prepare状态、主库写binlog,然后从库拉取binlog去回放,从库回放成功后返回给主库ack确认,所有的从库都完成回放后主库提交事物。这样是可以保证主从数据⼀致的但是缺点就是速度太慢了。
半同步:
主库写redolog 事物处于prepare状态、主库写binlog,然后从库拉取binlog后返回给主库ack,在众多从库中只要收到⼀个ack主库就提交事物
异步复制:
主库根本不管从库有没有拉取回放binlog,直接写redo、binlog、然后提交事物
⾸先不允许出现主从数据不⼀致的情况:如果主从不⼀致对业务来说是有损的,⼀旦发⽣主从数据不⼀致的情况,从库就会出现断开连接的可能。
6、说说你了解的MySQL慢查询?
MySQL有监控项:slow query , MySQL会将所有执⾏时间超过阈值的SQL记录到慢查⽇志中
我们的监控系统可以监控: 当检测到有慢查时触发报警
通常出现慢查到情况如下:
1、表中的数据量很⼤,⽽且SQL的执⾏没有⾛索引
2、数据量太⼤了,即使⾛了索引依然超过了阈值
3、⼤量的慢查占据MySQL连接,导致正常的SQL得不到连接执⾏从⽽变成慢查SQL
4、优化器选错了索引
查看慢查时间阈值
查看执⾏时间最长的10条SQLspringboot最佳工程结构
mysqldumpslow -s a1 -n 10 mysql.slow_log
7、说说MySQL的执⾏计划
什么是执⾏计划
每次提交⼀个SQL到MySQL,MySQL内核的查询优化器会针对这个SQL的语意⽣成⼀个执⾏计划,这个执⾏计划就代表了他会查哪些表?⽤哪些索引,如何做排序和分组
response设置状态码执⾏不同的sql有哪⼏种情况
单表查询举例:
⽰例1:
id是主键、name是唯⼀索引像这种可以直接根据聚簇索引或者⼆级索引+回表就能查询到我们想要的
数据的⽅式在执⾏计划中称为 const
要求⼆级索引必须是唯⼀索引,才属于const
⽰例2:linux命令大全简单易懂
select* fromtablewherename= x ;
name是普通索引查询的过程是:从name这个B+树中查询出⼀条记录后,得到记录的主键id,然后去聚簇索引中回表,这种查询⽅式速度也很快,在执⾏计划中叫:ref
⽰例3:
select* fromtablewherename= xandage = yandxx=yy ;
name、age、xx为普通索引这种sql要求where条件之后的SQL全得是等值⽐较,在执⾏计划中才算做是ref
⽰例4:
select* fromtablewherename= xandnameisNULL;media vertical
name为普通索引这种sql就是在⼆级索引中同时搜索name = x和name = null的值,然后去主库中回表。这种在执⾏计划中被称为ref_or_null
⽰例5:
select* fromtablewhere age >=xandage <=y
age是普通索引像这样使⽤普通索引做范围查询,在执⾏计划中称为 range
⽰例6:index⽅式
index⽅式并不是说执⾏计划使⽤了索引,从聚簇索引中⼀路⼆分往下⾛。
假设有联合索引:key(x1,x2,x3)
查询语句如下:
selectx1,x2,x3 fromtablewhere x2=xxx;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论