• 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的区别

    1. B+Tree 叶子节点只存放数据,非叶子节点只存放指针数据 ,BTree 非叶子节点既存放指针也存放数据,B+tree单个节点的数据量更小,在相同的磁盘I/O次数下,能查询更多的节点
    2. 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分布式锁

  • 相关阅读:
    1.2 无处不在的进程和线程
    全网最牛自动化测试框架系列之pytest(6)-Fixture(固件)
    华为机试 - 找出经过特定点的路径长度
    Java/HTML/CSS/JavaScript/Jsp实现的药店管理系统源码
    Git常用命令
    nodejs+vue+elementui线上买菜系统
    多大的串扰算大?
    C++ 函数:在相同类型参数情况下返回不同类型值
    C语言linux socket服务端
    vscode类似GitHub Copilot的插件推荐
  • 原文地址:https://blog.csdn.net/qq_36441027/article/details/125016035