MySQL必会核心问题50讲
获课:itazs.fun/13237/
获取ZY↑↑方打开链接↑↑
《MySQL 必会核心问题 50 讲》中一些非常重要的内容:
一、基础概念部分
数据存储引擎
InnoDB 是 MySQL 默认的存储引擎。它支持事务,具有 ACID(原子性、一致性、隔离性、持久性)特性。例如,在一个银行转账系统中,从一个账户扣款并向另一个账户存款的操作必须是原子的,要么全部成功,要么全部失败,InnoDB 可以很好地保证这种事务的完整性。
MyISAM 不支持事务,但它的读写速度在某些简单场景下可能比 InnoDB 快。它适用于以读为主的场景,如一些数据仓库中的历史数据查询。MyISAM 存储引擎会将表存储为三个文件,分别是.frm(存储表结构)、.MYD(存储数据)和.MYI(存储索引)。
InnoDB 和 MyISAM 的对比
SQL 基础语法
用来删除表中的数据。如DELETE FROM table_name WHERE condition,要谨慎使用DELETE语句,特别是没有WHERE条件时,会删除表中的所有数据。
用于修改表中的数据。例如UPDATE table_name SET column1 = new_value1 WHERE condition,其中condition是更新的条件,如WHERE id = 1就只会更新id为 1 的记录。
用于向表中插入数据。简单的插入语句如INSERT INTO table_name (column1, column2) VALUES (value1, value2)。可以一次插入多条记录,例如INSERT INTO table_name (column1, column2) VALUES (value1, value2), (value3, value4)。
这是最常用的 SQL 语句之一。例如,SELECT * FROM table_name可以查询表table_name中的所有列和行。还可以使用SELECT column1, column2 FROM table_name来指定查询特定的列。在多表查询中,JOIN操作很关键,如内连接INNER JOIN,可以通过关联条件从多个表中获取相关的数据。例如,有一个orders表和一个customers表,orders表中有customer_id字段关联customers表中的id字段,使用SELECT * FROM orders INNER JOIN customers ON orders.customer_id = customers.id可以获取包含订单信息和顾客信息的结果集。
查询语句(SELECT)
插入语句(INSERT)
更新语句(UPDATE)
删除语句(DELETE)
二、索引相关内容
索引的作用和原理
索引就像是一本书的目录,它可以大大提高查询速度。当执行查询操作时,数据库会先在索引中查找相关的记录位置,然后再去数据文件中获取具体的数据。例如,在一个包含大量用户信息的表中,如果经常根据用户的姓名进行查询,那么在姓名列上创建索引,会使查询姓名相关的操作变得更加高效。
索引的类型
哈希索引是基于哈希表实现的。它对于等值查询(如SELECT * FROM table_name WHERE column = value)非常高效,但是不支持范围查询。在内存数据库等场景下,哈希索引可以发挥很好的作用。
这是 MySQL 中最常用的索引类型。它是一种平衡树结构,能够快速地定位数据。例如,对于一个范围查询,如SELECT * FROM table_name WHERE column BETWEEN value1 AND value2,B - Tree 索引可以有效地找到满足条件的记录范围。
B - Tree 索引
哈希索引
三、事务处理
事务的隔离级别
这是最高的隔离级别,所有事务串行执行,就像单线程一样,完全避免了并发问题,但会严重影响系统的性能。
这是 InnoDB 默认的隔离级别。它可以保证在一个事务中多次读取同一数据的结果是一致的,通过 MVCC(多版本并发控制)机制来实现。例如,在一个事务中,不管其他事务如何修改数据,只要该事务不结束,它读取的数据版本始终是一致的。
可以避免脏读,一个事务只能读取到另一个事务已经提交的数据。但是可能会出现不可重复读的问题,即一个事务在两次读取同一数据时,由于另一个事务在中间提交了修改,导致两次读取的数据不一致。
这是最低的隔离级别,一个事务可以读取到另一个未提交事务的数据。可能会导致脏读问题,例如事务 A 修改了数据但未提交,事务 B 就读取了事务 A 修改的数据,然后事务 A 回滚,事务 B 读取的数据就是无效的 “脏数据”。
读未提交(Read Uncommitted)
读已提交(Read Committed)
可重复读(Repeatable Read)
串行化(Serializable)
事务的实现原理(如 redo log 和 undo log)
用于事务的回滚操作。当事务执行修改操作时,undo log 会记录修改前的数据状态。如果事务需要回滚,就可以根据 undo log 将数据恢复到修改前的状态。例如,在一个事务中删除了一条记录,undo log 会记录这条记录的原始信息,以便在回滚时可以重新插入这条记录。
用于在数据库崩溃后恢复已经提交的事务修改。当一个事务提交时,它的修改操作会先记录在 redo log 中,然后再应用到数据库中。如果数据库在修改过程中崩溃,重启后可以根据 redo log 重新执行这些修改操作,保证数据的持久性。
redo log(重做日志)
undo log(回滚日志)
四、性能优化部分
查询优化
解释查询计划(EXPLAIN)是非常重要的工具。通过EXPLAIN SELECT...语句,可以查看 MySQL 是如何执行查询的,包括使用了哪些索引、连接类型等信息。例如,如果发现查询没有使用预期的索引,可以根据EXPLAIN的结果来调整查询语句或者索引。
数据库架构优化
合理的表结构设计和数据库架构对于性能至关重要。例如,适当的范式化可以减少数据冗余,但在某些情况下,反范式化可以提高查询性能。如在一个电商系统中,将订单表和商品表进行关联查询可能会比较复杂,如果将一些商品的常用信息(如名称、价格)冗余存储在订单表中,对于查询订单详情的操作可能会更方便快捷。同时,对于大型数据库,采用分库分表技术可以有效地解决数据量过大和高并发访问的问题。