Mysql面试题

120 阅读7分钟

MySQL 的索引是什么?

MySQL 索引是一种特殊的数据结构,索引存储了表中数据的一部分,按照特定的顺序存储,主要类型有:B+树索引、Hash索引、全文索引

什么情况下会造成锁表?

  1. 对表进行大范围的修改操作,例如执行 alter table、update、delete 等操作时
  2. 在数据库中执行事务处理,例如执行 start transaction、commit、rollback 等操作时
  3. 在数据库中执行长时间的查询,例如执行需要扫描整个表的 select 语句时
  4. 某些特定的数据库配置参数和优化方案可能导致表锁,例如设置了强制表锁选项等

如何解决 MySQL 的死锁问题?

  1. 优化事务处理流程:通过优化事务的处理顺序和方式,减少事务之间的竞争情况,从而避免死锁的发生。
  2. 使用不加锁的查询语句:对于那些不需要加锁的数据,可以使用不加锁的 SELECT 语句访问数据,避免锁竞争。
  3. 使用合理的事务隔离级别:MySQL 支持不同的事务隔离级别,可以根据业务需要选择合适的事务隔离级别,减少锁竞争。
  4. 调整 InnoDB 的锁超时时间:MySQL 的 InnoDB 引擎默认的锁超时时间为 50 秒,可以根据需要调整锁超时时间,减少死锁的发生。
  5. 使用正确的事务提交方式:采用自动提交事务或显示提交事务,避免死锁的发生

MySQL的存储引擎有哪些,主要有什么区别?

主要有InnoDB、MyISAM等,主要区别有以下几点:

  • 事务支持:InnoDB 支持事务,MyISAM 不支持事务
  • 锁定:InnoDB 支持行级锁和表级锁,MyISAM 只支持表级锁
  • 空间使用:InnoDB 占用更多的磁盘空间,因为它存储了额外的信息以实现事务。MyISAM 占用较少的空间,但性能相对较差
  • 查询速度:MyISAM 查询速度更快,因为它使用静态表结构,而 InnoDB 使用动态表结构,查询速度相对较慢

如何优化 MySQL 的查询性能?

  1. 索引:在需要经常查询的字段上建立索引,加速查询
  2. 正确的数据类型:选择合适的数据类型,减小存储空间并加快查询速度
  3. 合理的表结构:使用合适的表结构
  4. 缓存:使用缓存,减少查询的数据库的频率
  5. 优化查询语句:使用合适的查询语句,避免不必要的操作,如连接过多的表
  6. 服务器设置:优化服务器设置,如内存缓存大小,数据库连接池大小等

如何实现 MySQL 的数据备份和恢复?

  1. mysqldump命令:可以通过命令行将数据库的数据导出到文件,以备份数据。恢复数据时,可以通过命令行将备份的文件导入到数据库
  2. MySQL Enterprise Backup:官方推出的一款备份工具,支持在线备份、增量备份、全量备份等功能,在备份过程中不会影响数据库的正常使用
  3. 使用 GUI 工具:如 PHPMyAdmin,MySQL Workbench 等。这些工具提供了图形界面的操作方式,方便用户进行数据备份和恢复操作。

什么是 MySQL 的触发器?

MySQL 触发器是数据库管理系统中的一种特殊对象,它可以在特定的数据变动发生时自动执行特定的动作。换句话说,触发器是在数据表上定义的一组数据库操作,它可以在插入、更新或删除数据时自动执行。触发器可以帮助开发人员维护数据的完整性,同时也可以自动执行复杂的业务逻辑。

EXPLAIN的分析结果字段有哪些?

  1. type:查询类型,效率从上到下降低,主要有以下几种:
    • system:表只有一行记录,该查询为系统表的查询;
    • const:MySQL 使用索引把查询条件缩小到了一个范围,并且查询只返回一行;
    • eq_ref:查询使用了索引,每个索引都对应一行;
    • ref:查询使用了索引,但每个索引可能对应多行;
    • range:查询使用了索引范围扫描;
    • index:查询使用了全表扫描;
    • all:查询使用了全表扫描,并进行了表连接。
  1. key:使用的索引名称
  2. key_len:使用的索引长度
  3. ref:使用的常量,如果没有则显示为NULL
  4. rows:扫描的行数
  5. Extra:额外的信息,可以帮助

MySQL主从同步步骤

  1. 执行更新sql语句
  2. 主库binlog dump 线程,将binlog的更新发给从库
  3. 从库io线程收到binlog更新部分,写入relay log内容
  4. 从库sql线程读取relay log 内容,重新执行sql与主从一致

MySQL中有哪些日志

  • Error Log: 记录 MySQL 服务器的错误信息
  • General Log: 记录所有的连接和查询请求
  • Binary Log: 记录所有对数据库的修改操作,主要用于数据备份和恢复以及主从复制
  • Slow Query Log: 记录慢查询信息,帮助开发人员诊断数据库性能问题
  • Relay Log: 主从复制中从服务器所使用的日志,用于存储从主服务器接收到的二进制日志信息

事务的基本特性

  1. 原子性:事务中的所有操作要么全部成功,要么全部失败,不会存在部分成功的情况。
  2. 一致性:事务执行前后数据库状态符合数据库完整性约束。
  3. 隔离性:多个事务并发执行时不会相互影响。
  4. 持久性:事务一旦提交,对数据库的修改是持久的,即使数据库发生故障也不会丢失。

这四个特性组合在一起构成了事务的ACID特性(原子性,一致性,隔离性,持久性)

事务的隔离级别有哪些?

  1. 读未提交 (Read Uncommitted): 允许一个事务读取另一个未提交事务的数据,可能会出现脏读、不可重复读或幻读的情况。
  2. 读已提交 (Read Committed): 只允许读取已经提交的数据,避免了脏读,但仍可能出现不可重复读或幻读的情况。
  3. 可重复读 (Repeatable Read): 在该隔离级别下,一个事务内的多次读取是相同的,但它仍然可能遭受幻读。
  4. 串行化 (Serializable): 在该隔离级别下,事务串行执行,每个事务独占一个读锁。这是最高的隔离级别,但同时也是最低的效率。

一条查询语句的内部执行过程

连接mysql->查询缓存->语句解析器(校验sql)->预处理器->查询优化器->执行计划->查询执行引擎->返回结果

MySQL的其他一些注意事项

  1. 前导模糊查询不能使用索引,如name like ‘%静’
  2. Union、in、or可以命中索引,建议使用in
  3. 负条件查询不能使用索引,可以优化为in查询,其中负条件有!=、<>、not in、not exists、not like等
  4. 存在非等号和等号混合判断条件时,在建索引时,要把等号条件的列前置
  5. 范围列可以用到索引,但是范围列后面的列无法用到索引,索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引。范围条件有:、>=、between等
  6. 把计算放到业务层而不是数据库层,因为在字段上计算不能命中索引
  7. 强制类型转换会全表扫描,如phone字段是varcher类型,则下面的SQL不能命中索引。Select * fromuser where phone=13800001234
  8. 利用覆盖索引来进行查询操作,避免回表
  9. 建立索引的列不能为null,使用not null约束及默认值
  10. 利用延迟关联或者子查询优化超多分页场景
  11. 超过三个表最好不要用join,需要join的字段,数据类型必须一致,多表关联查询时,保证被关联的字段需要有索引
  12. 如果明确知道查询结果只要一条,limit 1能够提高效率,比如验证登录的时候
  13. 使用合理的分页提高效率,比如 select id,name from product where id> 866612 limit 20