mysql面试

1,innodb和myisam存储引擎

mysql默认innodb,通常选择innodb

  • 事务支持:InnoDB支持事务处理,具备ACID特性,而MyISAM不支持事务,适合不需要事务处理的场景。

  • 锁定机制:InnoDB实现了行级锁定,提高了并发写入性能,而MyISAM只支持表级锁定,当进行写操作时会锁住整个表,影响并发读写。

  • 数据存储结构:InnoDB使用聚簇索引,数据文件本身就是索引文件,而MyISAM的索引文件和数据文件是分开的,数据文件(.MYD)存储实际数据,索引文件(.MYI)存储索引信息。

  • 外键支持:InnoDB支持外键约束,可以维护数据的一致性,而MyISAM不支持外键。

  • 数据恢复:InnoDB在系统崩溃后能自动恢复到最近的事务状态,而MyISAM依赖于操作系统级别的备份和修复工具。

  • 内存使用:InnoDB使用缓冲池(Buffer Pool)缓存数据和索引,占用更多内存但提升了数据访问速度;MyISAM只缓存索引,不缓存数据。

  • 表统计信息:MyISAM存储表的总行数,查询COUNT()时直接返回,而InnoDB不存储总行数,执行COUNT()时需要实际计算。

myisam的优势

  1. 高速读取:MyISAM在读取操作上表现优秀,特别是当执行大量的SELECT查询时。它的结构简单,没有事务处理和行级锁的开销,使得读取操作非常迅速。

  2. 全文索引:MyISAM支持全文索引,这对于需要执行全文本搜索的应用程序是一个显著的优势。虽然InnoDB从MySQL 5.6开始也支持全文索引,但在某些场景下,MyISAM的全文索引可能仍然更高效或更容易配置。

  3. 简单和易于维护:由于不支持复杂的事务和行级锁机制,MyISAM的表结构和管理更为简单。对于那些不需要复杂数据完整性或并发控制的小型项目或简单的读写应用程序,MyISAM可能更易于理解和维护。

  4. 占用空间小:相比InnoDB,MyISAM的表通常占用更少的磁盘空间,尤其是当表中包含许多固定长度的数据时。这是因为MyISAM可以使用更紧凑的存储格式,如静态型和压缩型。

  5. 表级锁定在某些场景下有益:虽然表级锁定限制了并发写入,但它简化了锁定机制,使得锁定的实现成本较低。在读多写少的环境中,如果对并发写入的要求不高,表级锁可能不会成为性能瓶颈。

  6. 性能统计和计数:MyISAM存储表的元数据,如行数,这使得执行COUNT(*)查询时无需全表扫描,对于只包含计数的查询来说更快。

2,什么是索引?索引的类型有哪些?各自的应用场景是什么?

  1. 主键索引 (Primary Key Index)

    • 特点:唯一且非空,每个表只能有一个主键索引。
    • 应用场景:作为数据行的唯一标识符,确保数据的唯一性,常用于表的关联查询。
  2. 唯一索引 (Unique Index)

    • 特点:索引列的值必须唯一,但允许有空值。
    • 应用场景:适合用于需要保证某列数据唯一性,但又可以接受空值的情况,如邮箱地址。
  3. 普通索引 (Non-Unique Index / Secondary Index)

    • 特点:索引列的值不必唯一,可以有重复。
    • 应用场景:通用的加速查询手段,适用于任何需要提升查询速度的列。
  4. 全文索引 (Full-text Index)

    • 特点:针对文本类型的数据,可以进行全文搜索,如文章内容。
    • 应用场景:适合于包含大量文本数据的列,如博客文章、新闻内容等,进行模糊查询或全文搜索。
  5. 组合索引 (Composite Index / Multi-Column Index)

    • 特点:基于多个列创建的索引。
    • 应用场景:当查询条件涉及多个列时,组合索引可以显著提高查询速度,尤其是在这些列的顺序和索引定义的顺序相匹配时。
  6. 聚集索引 (Clustered Index)

    • 特点:表中的数据行按照索引的顺序物理存储。每个表只能有一个聚集索引。
    • 应用场景:通常用于主键,因为频繁的排序和范围查询可以受益于数据的物理排序。
  7. 非聚集索引 (Non-Clustered Index)

    • 特点:索引和数据分开存储,索引中包含指向数据行的指针。
    • 应用场景:适用于除了聚集索引外需要加速查询的其他列,特别是当数据不适合物理排序时。

3.什么是死锁?MySQL如何检测和解决死锁?

4.备份与恢复

  • MySQL中有哪些备份策略?如何实现全备和增量备份?
  • 如何进行数据库的恢复操作?

5.复制与集群

  • MySQL的复制机制是如何工作的?有哪些复制模式?
  • 介绍MySQL的高可用架构,如主从复制、主主复制、GTID复制等。
  • nnoDB Cluster和Group Replication是什么?它们如何提供高可用性?

6.mvcc

多版本并发控制,允许数据存在多个版本,减少锁的使用提升并发能力。

多版本:mysql管理着行数据的多个版本

在可重复读和读已提交 隔离级别下有效。

通过记录中的三个隐藏字段+undo日志中的版本链+readview一致性视图来实现的

并发控制:并发环境下多个事务操作同一数据时,mysql控制返回多个版本中的一个版本

相关概念:

当前读:select ... lock in share mode

                select ... for update

                insert/update 

当前读与锁相关

快照读:select 非阻塞式读

并发场景:

读-读:无问题

读-写:有脏读,不可重复读,幻读问题。mvcc机制去控制。

写-写:有更新丢失问题,应用去控制

SELECT ... FOR UPDATE

SELECT ... FOR UPDATE用于获取排他锁(exclusive lock),这意味着其他事务不能同时对锁定的行进行读或写操作,直到当前事务结束。这可以防止其他事务在当前事务完成之前修改或删除被锁定的行,因此能有效地避免不可重复读和脏读。

SELECT ... LOCK IN SHARE MODE

SELECT ... LOCK IN SHARE MODE用于获取共享锁(shared lock),这意味着其他事务可以读取被锁定的行,但不能修改或删除它们。这同样有助于避免不可重复读和脏读,但允许并发读取,只要不涉及写操作。

相关推荐

  1. MySQL面试

    2024-07-09 16:54:11       51 阅读
  2. mysql面试

    2024-07-09 16:54:11       30 阅读
  3. Mysql面试

    2024-07-09 16:54:11       27 阅读
  4. mysql面试

    2024-07-09 16:54:11       30 阅读
  5. MySQL面试题总结

    2024-07-09 16:54:11       57 阅读
  6. MySQL面试

    2024-07-09 16:54:11       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 16:54:11       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 16:54:11       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 16:54:11       42 阅读
  4. Python语言-面向对象

    2024-07-09 16:54:11       53 阅读

热门阅读

  1. linux程序安装-编译-rpm-yum

    2024-07-09 16:54:11       21 阅读
  2. Haproxy搭建Web群集

    2024-07-09 16:54:11       30 阅读
  3. DNS隧道

    DNS隧道

    2024-07-09 16:54:11      28 阅读
  4. 利用node连接mongodb实现一个小型后端服务系统demo

    2024-07-09 16:54:11       26 阅读
  5. pdfplumber vs PyMuPDF:PDF文本、图像和表格识别的比较

    2024-07-09 16:54:11       28 阅读
  6. 编写简单的Ansible Playbook

    2024-07-09 16:54:11       25 阅读
  7. VSCode + 阿里云OSS + 图床插件Picgo

    2024-07-09 16:54:11       31 阅读