原理
MySQL 是一个关系型数据库管理系统,展现形式上使用表格存储数据,底层的数据存储方式主要涉及到存储引擎(Storage Engine)的实现。MySQL支持多种存储引擎,每个存储引擎都有自己的数据存储方式和特点
存储引擎
以下是一些常见的MySQL存储引擎以及它们的数据存储方式:
- InnoDB:
- InnoDB是MySQL的默认存储引擎,它支持事务处理和外键约束。
- 数据存储方式:InnoDB使用聚簇索引(Clustered Index)的方式存储数据,这意味着数据行的物理存储顺序与主键的逻辑顺序相匹配。每个InnoDB表格都有一个聚簇索引,通常是主键索引。
- MyISAM:
- MyISAM是另一种常见的存储引擎,它在一些旧版本的MySQL中常被使用。
- 数据存储方式:MyISAM使用表格级锁定(Table-Level Locking)和非聚簇索引的方式存储数据,数据行的物理存储顺序与插入顺序无关。
- MEMORY:
- MEMORY存储引擎将表格数据存储在内存中,适用于需要快速访问和临时数据存储的情况。
- 数据存储方式:数据存储在内存中,读取和写入速度非常快,但在数据库关闭时数据会丢失。
- Archive:
- Archive存储引擎用于存储大量的归档数据,通常用于数据归档和备份。
- 数据存储方式:Archive存储引擎使用压缩和行存储的方式,以最小化磁盘空间的使用。
- NDB Cluster:
- NDB Cluster是一个集群存储引擎,用于构建高可用性和高可扩展性的MySQL集群。
- 数据存储方式:NDB Cluster将数据分布在多个节点上,并使用内存存储和分布式存储技术来提供高性能和容错性。
这些存储引擎提供了不同的数据存储方式和特性,可以根据应用程序的需求选择合适的存储引擎。不同的存储引擎适用于不同的使用案例,例如InnoDB适合事务处理,MyISAM适合读密集型应用,MEMORY适合快速存取等。MySQL的存储引擎灵活性使得它能够适应各种不同的数据库需求。
基础语法
包括DML(数据操作语言)和DDL(数据定义语言)的语法:
类别 | SQL语法 | 描述 |
DML语句 | SELECTcolumn1, column2…FROMtableWHEREcondition; | 从表格中检索数据,可以使用条件筛选出特定的行。 |
INSERT INTOtable (column1, column2…) VALUES (value1, value2…); | 向表格中插入新的行,指定要插入的列和相应的值。 | |
UPDATEtableSETcolumn1 = value1, column2 = value2…WHEREcondition; | 更新表格中符合条件的行的数据。 | |
DELETE FROMtableWHEREcondition; | 从表格中删除符合条件的行。 | |
DDL语句 | CREATE TABLEtable (column1 datatype, column2 datatype…); | 创建新的表格,指定列名和数据类型。 |
ALTER TABLEtableADD COLUMNcolumn datatype; | 向已有表格中添加新的列。 | |
ALTER TABLEtableMODIFY COLUMNcolumn datatype; | 修改表格中已有列的数据类型。 | |
ALTER TABLEtableDROP COLUMNcolumn; | 从表格中删除指定的列。 | |
DROP TABLEtable; | 删除整个表格以及表格中的所有数据。 | |
TRUNCATE TABLEtable; | 删除表格中的所有数据,但保留表格结构。 |
这些是MySQL中最基本的SQL语法,用于查询、插入、更新、删除数据以及定义和修改表格结构。学会合理使用这些语法,可以进行广泛的数据库操作。请注意,在实际应用中,需要根据具体的业务需求和数据模型使用不同的SQL语句。
连表查询
各种连表查询的语句和效果:
连接类型 | SQL语句 | 效果和描述 |
INNER JOIN | SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column; |
返回两个表格中满足连接条件的行,只包括那些在两个表格中都有匹配的行。 |
LEFT JOIN | SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column; |
返回左表格中所有的行,以及右表格中与左表格匹配的行。如果没有匹配的行,右表格中的列将显示NULL。 |
RIGHT JOIN | SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column; |
返回右表格中所有的行,以及左表格中与右表格匹配的行。如果没有匹配的行,左表格中的列将显示NULL。 |
FULL OUTER JOIN | SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column; |
返回所有行,包括左表格和右表格中的所有行。如果没有匹配的行,对应的列将显示NULL。 |
SELF JOIN | SELECT * FROM table AS t1 INNER JOIN table AS t2 ON t1.column = t2.column; |
自连接是在同一表格中连接不同行的查询,用于处理具有层次结构的数据或依赖于相同表格的数据。 |
这些不同类型的连接允许你在多个表格之间建立关联,以获取更复杂的查询结果。INNER JOIN返回匹配的行,LEFT JOIN返回左表格的所有行以及与右表格匹配的行,RIGHT JOIN返回右表格的所有行以及与左表格匹配的行,FULL OUTER JOIN返回所有行,而自连接允许你在同一表格中建立关联。
索引
当涉及到MySQL的索引优化时,了解如何设计和使用索引以提高查询性能是非常重要的。MySQL支持多种索引类型,每种类型适用于不同的情况。下面是关于MySQL索引优化的相关内容:
索引类型 | 描述 | 何时使用 |
B/B+树索引 | 最常用的索引类型,适用于等值查询和范围查询。 | - 当需要在列上执行等值查询(例如WHERE column = value)时。 - 当需要在列上执行范围查询(例如WHERE column > value)。 |
哈希索引 | 适用于等值查询,但不适用于范围查询或排序操作。 | - 当需要在列上执行非常快速的等值查询(例如WHERE column = value)时。 |
全文索引 | 用于全文搜索,适用于文本数据的模糊匹配。 | - 当需要在文本列上执行全文搜索时,例如使用MATCH AGAINST语句进行全文搜索。 |
空间索引 | 用于地理数据类型,支持地理坐标的范围和距离查询。 | - 当需要在地理数据类型列上执行地理坐标范围查询或距离查询时,例如地图应用程序中的位置搜索。 |
组合索引 | 多个列的联合索引,适用于多个列的查询条件。 | - 当查询中涉及多个列的条件时,可以考虑创建组合索引以加速这些查询。 |
唯一索引 | 确保列中的值是唯一的,通常用于主键或唯一约束。 | - 当需要确保列中的值不重复时,可以创建唯一索引。 |
聚簇索引 | 特殊类型的索引,决定了数据在磁盘上的物理存储顺序。 | - 聚簇索引通常用于主键列,可以加速主键查询。 |
需要注意的是,索引不是越多越好,不必为每个列都创建索引。过多的索引会增加写操作的开销,并且可能导致索引失效的情况。因此,在设计索引时,要根据具体的查询需求和数据模式选择合适的索引类型和列。定期监控索引的性能,根据实际情况进行调整,以确保数据库的高性能运行。
事务
解释:事务是数据库操作的一个逻辑单元,它要么完全执行,要么完全回滚,具有原子性。它的四个特性:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
会用到的命令:
命令 | 解释 | 用法示例 |
START TRANSACTION |
启动一个新的事务。 | START TRANSACTION; 或 BEGIN; 可以用来启动一个新事务。 |
COMMIT |
提交事务并将更改永久保存到数据库。 | COMMIT; 用于提交当前事务,将所有更改永久保存到数据库中。 |
ROLLBACK |
回滚事务并撤销在事务中的更改。 | ROLLBACK; 用于回滚当前事务,撤销在事务中的所有更改,将数据库恢复到事务开始前的状态。 |
SAVEPOINT |
创建一个保存点,用于部分回滚事务。 | SAVEPOINT savepoint_name; 用于创建一个保存点,之后可以使用 ROLLBACK TO savepoint_name; 部分回滚事务。 |
RELEASE SAVEPOINT |
删除一个保存点。 | RELEASE SAVEPOINT savepoint_name; 用于删除一个保存点,释放相关资源。 |
ROLLBACK TO |
部分回滚事务到指定的保存点。 | ROLLBACK TO savepoint_name; 用于将事务回滚到指定的保存点,撤销该保存点之后的更改。 |
SET TRANSACTION |
设置事务的特性,如隔离级别。 | SET TRANSACTION ISOLATION LEVEL isolation_level; 用于设置事务的隔离级别,可选的隔离级别包括 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。 |
这些命令用于启动、提交、回滚事务以及管理事务中的保存点。通过使用这些命令,可以确保事务具有ACID属性(原子性、一致性、隔离性、持久性),并根据需要部分回滚或设置事务的隔离级别。这些命令对于数据库开发和管理中的事务控制非常重要。
隔离级别
隔离级别定义了多个事务之间的可见性和并发性,不同的隔离级别会影响事务之间是否能看得到增删改查。
隔离级别 | 介绍 | 定义 | 解释 | 解决的问题 |
READ UNCOMMITTED | READ UNCOMMITTED是最低的隔离级别。 | 允许一个事务读取另一个正在执行的事务未提交的更改。 | 可能会出现"脏读"、"不可重复读"和"幻读"等问题。 | - 需要极高的并发性,且对数据一致性要求不高的情况。 |
READ COMMITTED | READ COMMITTED是MySQL的默认隔离级别。 | 允许一个事务只读取已提交的其他事务的更改。 | 解决了"脏读"问题,但仍可能出现"不可重复读"和"幻读"。 | - 适用于大多数应用程序,提供合理的并发性和数据一致性。 |
REPEATABLE READ | REPEATABLE READ提供了更高的隔离性。 | 在事务内部,禁止其他事务插入新数据,但仍可读取已存在的数据。 | 解决了"不可重复读"问题,但仍可能出现"幻读"。 | - 需要较高的数据一致性,对并发性要求适度的情况。 |
SERIALIZABLE | SERIALIZABLE是最高的隔离级别。 | 在事务内部,禁止其他事务插入新数据和读取已存在的数据。 | 提供了最高的隔离性,防止"不可重复读"和"幻读"等问题。 | - 需要最高级别的数据一致性和严格的隔离的情况。 |