MySQL面试题

数据库优化方案

  1. 首先,在设计数据库表结构的时候,对每个字段选择合适的数据类型,合适的数据类型对后续的运算以及存取起到很大的作用。(tinyint和int的案例)     
  2. 项目上线之后,可以通过一些监控手段(Mybatis的插件、MySQL的慢查询日志等),获知哪些SQL执行速度较慢。针对性的对这些SQL进行相关优化。可以通过执行计划,分析SQL语句的执行方式,结合索引以及SQL语句的一些优化形式,对SQL的执行过程进行优化。(索引的原理与特点描述)     
  3. 如果通过索引也没办法优化当前的SQL执行效率,可能是因为查询的数据量太大或者是本来表中的数据已经超过了索引能承受的范围。需要考虑是否通过分页解决,或者分库分表改变数据库的本来的结构。(分片规则、分库的原则)     
  4. 通过硬件层面的优化,也能有效的对MySQL执行效率有很大的帮助,比如换成多核的CPU、更大的内存或者固态硬盘

Mybatis怎么查询多条数据?

  1. XML中只需resultType属性值为实体对象别名或全路径名。
  2. mybatis会通过接口文件的返回值类型来判断返回的是集合还是对象。如果是对象,则按常规查询并返回;如果是List集合,mybatis则会将查询到的多条记录设置进集合中并返回。

怎么看MySQL的执行计划

  1. explain(EX普冷)  select …………….(在相应的select前面加explain即可)

MySQL索引失效怎么办

  1. 范围查询, 右边的列不能使用索引, 否则右边的索引也会失效.
  2. 不要在索引上使用运算, 否则索引也会失效.
  3. 字符串不加引号, 造成索引失效.
  4. 尽量使用覆盖索引, 避免 select *, 这样能提高查询效率.
  5. 用 or 分割开的条件, 如果 or 前面的列有索引, or 后面的列没有索引, 那么查询的时 候前后索引都会失效,如果一定要用 or 查询, 可以考虑下 or 连接的条件列都加索引, 这样就不会失效了.

事务的隔离级别?

读未提交(read Uncommited):

  1. 在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据,会产生脏读问题,在项目中基本不怎么用, 安全性太差;

读已提交(read commited):

  1. 这是大多数数据库默认的隔离级别,但是不是 MySQL 的默认隔离级别;这个隔离级别满足 了简单的隔离要求:一个事务只能看见已经提交事务所做的改变,所以会避免脏读问题;由于一个事务可以看到别的事务已经提交的数据,于是随之而来产生了不可重复读和虚读等问题(下面详细介绍这种问题,结合问题来理解隔离级别的含义);

可重复读(Repeatable(瑞匹乐博) read):

  1. 这是 MySQL的默认隔离级别,它确保了一个事务中多个实例在并发读取数据的时候会读取到一样的数据;不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当 用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

可串行化(serializable(C瑞尔奈斯博)):

  1. 事物的最高级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之, 它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,一 般为了提升程序的吞吐量不会采用这个;

主键和索引的区别?

主键

外键

索引

定义:

唯一标识一条记录,不能

### MySQL 面试题整理及答案解析 以下是一些常见的 MySQL 面试题及其详细解析,涵盖了从基础到深入的知识点。这些问题可以帮助面试者更好地准备相关技术面试。 --- #### 1. 什么是MySQL优化器?它是如何工作的? MySQL优化器是数据库管理系统中的一个组件,负责分析和选择执行SQL查询的最佳方式[^1]。它通过考虑不同的执行计划(如索引的使用、联接的顺序、数据检索方法等),并基于统计信息和内部算法选择成本最低的执行计划。 --- #### 2. MySQL中的全文索引是什么?它是如何工作的? MySQL中的全文索引是一种特殊类型的索引,主要用于支持全文搜索功能。它允许用户在文本字段中快速查找包含特定单词或短语的记录。全文索引的工作原理是将文本字段中的单词分解为单独的词条,并为每个词条创建倒排索引,从而加速搜索过程[^1]。 --- #### 3. 索引在MySQL中的工作原理是什么? 索引是一个数据结构(如B+树),它存储了表中一部分数据(通常是主键或某些列的值),并指向表中相应的行[^2]。当执行查询时,MySQL可以首先查找索引,而不是扫描整个表,从而快速定位到需要的数据[^2]。 --- #### 4. 如何判断索引是否有效? 可以使用 MySQL 的 `EXPLAIN` 命令来分析查询语句的执行计划。在执行计划中,通过查看 `key` 列是否使用了预期的索引,以及 `rows` 列显示的预估扫描行数等信息来判断索引是否有效。如果 `key` 列为 `NULL`,则表示没有使用索引;如果 `rows` 列的值过大,可能意味着索引的选择性不好或者查询条件不够优化,需要进一步调整索引或查询语句[^3]。 --- #### 5. 创建索引时需要注意哪些事项? 在创建索引时,需要考虑以下几个方面: - **索引的选择性**:确保索引列具有较高的选择性,以避免索引失效。 - **更新性能**:索引会增加写操作的成本,因此需要权衡查询和更新的性能。 - **复合索引的设计**:合理设计复合索引,遵循“最左前缀”原则,以提高查询效率[^3]。 --- #### 6. 如何优化MySQL查询性能? 优化MySQL查询性能的策略包括但不限于以下几点: - 使用合适的索引,减少全表扫描。 - 避免在索引列上使用函数或表达式,以免导致索引失效。 - 尽量减少子查询的使用,改为JOIN或其他替代方案。 - 定期分析和更新表的统计信息,确保优化器能够生成高效的执行计划[^2]。 --- #### 示例代码:如何使用EXPLAIN分析查询 ```sql -- 示例查询 SELECT * FROM users WHERE username = 'admin'; -- 使用 EXPLAIN 分析查询 EXPLAIN SELECT * FROM users WHERE username = 'admin'; ``` 通过上述命令,可以查看查询的执行计划,判断索引是否被正确使用。 --- #### 7. 什么是事务隔离级别?MySQL支持哪些隔离级别? 事务隔离级别用于控制多个事务之间的可见性和并发行为。MySQL支持以下四种隔离级别: - **READ UNCOMMITTED**:最低隔离级别,允许脏读。 - **READ COMMITTED**:禁止脏读,但允许不可重复读。 - **REPEATABLE READ**:默认隔离级别,禁止脏读和不可重复读,但可能出现幻读。 - **SERIALIZABLE**:最高隔离级别,完全串行化执行事务,禁止所有并发问题[^1]。 --- #### 8. InnoDB和MyISAM的区别是什么? InnoDB和MyISAM是MySQL中两种常用的存储引擎,主要区别如下: - **事务支持**:InnoDB支持事务,而MyISAM不支持。 - **外键约束**:InnoDB支持外键约束,而MyISAM不支持。 - **锁机制**:InnoDB使用行级锁,而MyISAM使用表级锁。 - **索引类型**:InnoDB支持聚簇索引,而MyISAM仅支持非聚簇索引。 --- #### 9. 如何处理MySQL中的死锁问题? 死锁是指两个或多个事务互相等待对方释放资源的情况。解决死锁问题的方法包括: - 设计合理的事务顺序,减少死锁发生的概率。 - 使用较低的隔离级别(如READ COMMITTED),以减少锁冲突。 - 捕获死锁错误(错误码1213),并在应用层重试事务。 --- #### 10. 如何优化大表的分页查询? 大表分页查询可能导致性能问题,可以通过以下方法优化: - 使用覆盖索引,避免回表操作。 - 替换 `LIMIT` 和 `OFFSET`,采用基于主键范围的查询。 - 示例代码: ```sql -- 基于主键范围的分页查询 SELECT * FROM orders WHERE id > 1000 ORDER BY id LIMIT 10; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值