mysq必看面经

    科技2024-12-16  10

    MySQL面经

    MySQL优化数据库的隔离级别数据库使用的数据结构MySQL聚簇索引和非聚簇索引的区别数据库为什么使用b+树的结构而不使用其他树说下b+树的数据结构说下b+树的时间复杂度

    MySQL优化

    可以考虑从下边几个方面说

    硬件 数据库的设计 外键 索引及sql语句的书写 字段 读写分离 引入缓存

    数据库的设计 遵循三大范式,避免数据冗余增加中间表,对于联合查询较多的表,可以先将其联合查询的数据先存入到一张中间表中,之后再查询时直接查中间表就行啦

    读写分离 数据库拆分,主库负责写,从库负责读

    分库分表

    垂直分表 例如一些表中,某些字段使用的频率很高,但一些字段使用的频率很低,可以将其分开存到两张表上,比如用户登录信息和基本信息 优点 每张表能存更多的信息,查询特定字段效率更高缺点 更容易导致join连接,会给逻辑层增加压力 水平分表 不破坏表的结构,当数量到达一定程度时,将其拆分到另一个库中 优点 能够支持很大的数据量缺点 不管运维,逻辑哪方面都会很麻烦,不建议使用

    外键 外键会降低mysql的效率,尽量避免使用

    sql语句的书写 1 可以用EXISTS替代IN,否则会导致全表扫描 2 避免where字句中使用表达式,函数,否则mysql不会使用索引 3 可以使用连接查询代替子查询 4 只查询想要的字段,避免使用select *,要过滤掉不需要的数据 5 避免where后跟or使用,否则会导致全表扫描

    字段 良好的字段设计可以提升sql查询的效率

    引入缓存 对于需要重复查询的数据,可以将其放入redis中,避免重复查询

    索引 1 加入索引,经常查询的字段可以加上索引,尽量在where或order by后的字段加上索引 2 可以将索引列设为非空,查询null或非null时不会使用索引

    主从复制 其实就是备份,原理是将主数据库中一切关于更改数据的操作放到binlog中,从数据库获取binlog的内容后再输出到relaylog(中继日志)中,之后再执行relaylog中的操作,这样就完成啦数据的拷贝

    优点 读写分离,主库负责写,从库负责读更加安全,主数据库崩啦还有从数据库能够降低数据库的压力

    数据库的隔离级别

    读未提交 就是a事务会读取到b事务未提交的数据,也就是脏读,是最低的隔离级别读已提交 a事务只能读取b事务提交后的数据,解决脏读,但如果a在查询某数据时,b事务修改数据还提交啦,导致两次查询不一致的问题:不可重复读可重复读 a事务读取时,b事务不可做修改(但能插入数据),解决啦两次查询不一致的问题,但因b事务仍能插入数据的原因导致a事务两次查询数据行多啦一列的问题:幻读可串行化,加锁,跟java的lock类似,a事务在对数据操作时,其他事务只能排队等待,直到a事务提交,能解决幻读

    数据库使用的数据结构

    答案 :b+树

    MySQL聚簇索引和非聚簇索引的区别

    首先索引是一种可以帮助我们快速检索数据的一种数据结构

    聚簇索引是已主键id生成索引树,叶子结点存放的是(主键id,具体数据)的这么一个形式; 非聚簇索引是已用户自定义关键字段生成索引树,叶子存放的是(关键字字段,主键id)这么一个形式,若想查找具体的数据,仍需通过聚簇索引再次找到需要的数据,这里贴上两张图就明白啦

    聚簇索引树 非聚簇索引树

    数据库为什么使用b+树的结构而不使用其他树

    答案 用其他树会导致树的高度非常高,导致效率降低因为b+树的磁盘读写代价低,b+树的非叶子节点不存储具体的值,只存储关键的索引key(这点也是b树与b+树的区别),能够存放的东西变多,自然索引IO的次数要比b树小b+树的查询效率比较稳定,因为详细的数据都存在叶子结点,查找时路径长度一致,所以查找效率相当b+树还解决啦b树遍历效率低的问题,b+树在最后的叶子结点处加上啦一条链表,提升啦遍历速度(这点也是b树与b+树的区别)

    说下b+树的数据结构

    b+树的关键字和指针数量是一致的

    说下b+树的时间复杂度

    首先说下一颗平衡二叉树(avl树),也叫高度平衡树,每次新增或删除都可能通过1次或多次平衡这颗树,平衡二叉搜索树,假设平衡二叉树的节点数为n,高度为h, 2^n-1=h,那么h=log2(n+1),那么平均查找效率为log2n再说b+树,假设为m阶的b+树,数据总量为平均查找时间复杂度: logmn=查找次数总结 所有树的搜索时间复杂度: log(树的分叉数)(记录总量)=查找次数
    Processed: 0.044, SQL: 8