数据库相关知识1. MySQL存储引擎有哪几种MySQL存储引擎主要有以下几种,但这里只列举两种最常用的,并在面试中常被比较:
- InnoDB:这是MySQL 5.5或更高版本的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。它支持提交、回滚和紧急恢复功能来保护数据。此外,InnoDB还支持行级锁定。
- MyISAM:该存储引擎管理非事务性表,提供高速存储和检索,并支持全文搜索。
MyISAM和InnoDB的区别:
- 事务支持:MyISAM不支持事务,而InnoDB支持事务。
- 外键支持:MyISAM不支持外键,而InnoDB支持外键。
- 锁定机制:MyISAM只支持表锁,不支持高并发;而InnoDB支持表锁和行锁(包括共享锁、排它锁、意向锁)。
- 适用场景:对于大量SELECT操作,MyISAM是更好的选择;而对于大量INSERT、UPDATE操作,InnoDB更为合适。
- 索引结构:MyISAM是非聚集索引,索引和数据分开存储,只缓存索引;而InnoDB是聚集索引,索引和数据存储在同一个文件中。
2. MySQL事务事务的概念:事务是一组SQL语句组成的逻辑单元,这些SQL语句要么全部执行,要么全部不执行。
事务的特性(ACID):
- 原子性(Atomicity):一组SQL语句要么全部执行,要么全部不执行,重点在单个事务本身。
- 一致性(Consistency):数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。
- 隔离性(Isolation):并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):事务一旦提交,它对数据库的改变是永久性的,其他操作或故障不应该对其有影响,重点也在单个事务本身。
事务的并发问题:
- 脏读:事务A读到了事务B未提交的数据(脏数据)。
- 不可重复读:在事务A中先后两次读取同一个数据,两次读取的结果不一样。脏读与不可重复读的区别在于,前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。
- 幻读:在事务A中按照某个条件先后两次查询数据库,两次查询结果的条数不同。不可重复读与幻读的区别可以通俗地理解为,前者是数据变了,后者是数据的行数变了。
事务隔离级别:
数据库实现事务隔离的方式,基本上可分为以下两种:
- 一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
- 另一种是不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。
MySQL支持的事务隔离级别有:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。其中,可重复读是MySQL的默认隔离级别。
3. MySQL锁InnoDB的锁机制:
InnoDB通过锁机制来保证同一时刻只能有一个事务对数据进行写操作。InnoDB的锁分为行锁(包括排它锁、共享锁)和表锁。
- 表锁:表级锁是MySQL最大粒度的锁定机制。特点是实现逻辑非常简单,带来的系统负面影响最小。获取锁和释放锁很快,可以避免死锁。表锁分为表共享读锁和表共享写锁,读锁不会阻塞其他用户对同一表的读请求,会阻塞对同一表的写请求;写锁会阻塞其他用户对同一表的任意请求。
- 行锁:行锁顾名思义就是在一行上加锁,锁定粒度小,带来的负面影响最小。可能会死锁。行锁的类型很多,包括共享锁、排他锁等。行锁使用不当会变成表锁。
4. MySQL分库分表分库分表的概念:
分库分表是数据库拆分策略的两种基本方式。分库是指将一个数据库中的数据分散存储到多个数据库中;而分表则是指将一个表中的数据按照某种规则拆分到多个表中。
分库分表的原因:
- 数据量过大:单个数据库或表的数据量过大,会影响查询性能。
- 并发访问量高:高并发访问会导致数据库性能下降,甚至崩溃。
- 业务模块划分:为了更好地管理数据和业务模块,需要将数据按照业务模块进行拆分。
分库分表的方式:
- 垂直拆分:按照业务模块或功能将数据库或表进行拆分。例如,将用户信息和订单信息分别存储在不同的数据库或表中。
- 水平拆分:按照某种规则(如用户ID、订单ID等)将数据库或表中的数据进行拆分。例如,将用户信息按照用户ID的奇偶性存储在不同的数据库或表中。
分库分表的挑战:
- 数据路由:如何根据请求快速定位到正确的数据库或表。
- 数据一致性:如何保证分库分表后的数据一致性。
- 事务处理:如何跨库跨表进行事务处理。
- 全局唯一ID生成:如何生成全局唯一的ID。
5. MySQL索引优化索引的概念:
索引是一种排好序的数据结构,它可以提高查询速度。MySQL中的索引主要有以下几种类型:主键索引、唯一索引、复合索引、聚簇索引、非聚簇索引和全文索引。
索引的选择原则:
- 具有唯一标识的字段:如用户ID、订单ID等。
- 长度不能太长的字段:索引会占用存储空间,因此应选择长度较短的字段。
- 查询频率高的字段:索引可以提高查询速度,因此应选择查询频率高的字段。
- 表的主外键:主外键通常用于关联查询,因此应建立索引。
索引的失效情况:
- 使用函数或表达式:在查询条件中使用函数或表达式会导致索引失效。
- 隐式类型转换:当查询条件中的数据类型与索引字段的数据类型不一致时,会发生隐式类型转换,从而导致索引失效。
- 范围查询:在范围查询中,只有范围条件列可以使用索引,其他列无法使用索引。
- LIKE查询:当LIKE查询的匹配模式以通配符开头时,索引会失效。
索引的优化建议:
- 选择合适的索引类型:根据查询需求选择合适的索引类型,如主键索引、唯一索引等。
- 避免过多的索引:虽然索引可以提高查询速度,但过多的索引会占用存储空间并降低写性能。因此,应根据实际情况合理设置索引数量。
- 定期维护索引:定期重建或优化索引可以提高索引的查询效率。
图片展示:
(由于markdown格式限制,无法直接展示图片链接中的图片,但以下图片描述和链接可用于在支持markdown的环境中插入图片)
(事务并发的三大问题:脏读示例)(事务并发的三大问题:不可重复读示例)(事务并发的三大问题:幻读示例)以上内容涵盖了MySQL存储引擎、事务、锁机制、分库分表以及索引优化等方面的知识,希望对解答您的问题有所帮助。