admin管理员组

文章数量:1794759

MySQL/Redis 常见面试题汇总

MySQL/Redis 常见面试题汇总

1、常见数据库引擎和区别

Innodb 支持行锁/表锁,支持事物,支持外键,不支持全文索引 【很多企业默认使用Innodb】 

MyIsam 不支持行锁/支持表锁,不支持外键,不支持事物 ,支持全文索引

2、MySQL事务及其特性

原子性(Atomicity): 一个事物所有操作全部完成或失败

一致性(Consistency): 事务开始和结束之后完整性没有被破坏

隔离性(Isolation): 允许多个事物同时对数据库修改和读写

永久性(Durablity): 事物提交之后,修改之后是永久不丢失的

3、MySQL索引的种类 3.1 按照数据结构/物理存储/字段特性/字段个数 进行索引分类

按数据结构分类可分为:B+tree索引、Hash索引、Full-text索引。 按物理存储分类可分为:聚簇索引、二级索引(辅助索引)。 按字段特性分类可分为:主键索引、普通索引、前缀索引。 按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引)

MySQL索引有哪些分类,你真的清楚吗? - SegmentFault 思否

3.2 字段类型分类可以分为主键索引和非主键索引

总体划分为两类,主键索引也被称为聚簇索引(clustered index),其余都称呼为非主键索引也被称为二级索引(secondary index)。

主键索引存储了整行数据,而非主键索引中存储的值为主键id,当查询的值在非主键索引树里面找不到的时候就会触发回表操作。

4、BTree 和 B+Tree的区别
  • B+Tree 叶子节点只存放数据,非叶子节点只存放指针数据 ,BTree 非叶子节点既存放指针也存放数据,B+tree单个节点的数据量更小,在相同的磁盘I/O次数下,能查询更多的节点
  • B+Tree的叶子节点有指针相连,所以再进行选择查询的时候可以快速移动,相比BTree范围查询速度更快
  • BTree结构

    B+Tree结构

    5、什么是回表

    当在一个索引树查询不到完整数据的情况,需要再次查找其他索引树的情况称为回表

    什么时候会使用回表操作,当使用的是非主键索引的时候,就会进行会表操作操作

    如何避免回表操作:使用覆盖索引

    6、如何实现覆盖索引

    只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表

    将被查询的字段,建立到联合索引里去。

    MySQL 覆盖索引详解 - 掘金

    7、列举创建索引但是无法命中的情况?

    使用or

    聚合索引没有遵循最左匹配

    like 查询 %再在前面

    在查询的字段选择函数计算

    使用 != , <>

    一张图搞懂MySQL的索引失效 - SegmentFault 思否

    8、1000W条数据,使用limit offset分页时,为什么越往后翻越慢?

    limit offset 执行过程是读取n行数据然后抛弃前面的数据,这样数据量大速度就会变慢,所以需要通过引入主键索引 或者 给需要查询的字段增加索引

    这句 SQL 的执行逻辑是

    • 1.从数据表中读取第N条数据添加到数据集中
    • 2.重复第一步直到 N = 10000 + 10
    • 3.根据 offset 抛弃前面 10000 条数
    • 4.返回剩余的 10 条数据

    百万级表Limit翻页越往后越慢咋办? - 云+社区 - 腾讯云

    9、SQL注入的攻击原理及如何在代码层面防止SQL注入

    SQL注入的攻击原理就是通过拼接SQL语句绕过代码逻辑,达到攻击的目的

    如何防止:不直接拼接SQL,适用预编译SQL,需要用户传入的字段进行类型判断然后再传入SQL模板

    10、实现Redis分布式锁过程

    先通过setnx设置锁,拿到锁的进程执行,没有拿到的等待,执行完之后通过del 删除锁,然后其他进程继续获得锁,通过设置过期时间来保证出现进程意外crash不释放锁的情况

    基于Python实现Redis 分布式锁_李俊的博客的博客-CSDN博客_python redis分布式锁

    本文标签: 面试题常见mySQLRedis