此外,根据索引的实现方式和应用场景,还可以分为B树索引、哈希索引、空间索引、位图索引等。
三、优点与缺点
优点:
缺点:
四、使用建议
-
为什么要使用索引?
-
数据库索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。以下是对数据库索引的详细解释:
一、定义与目的
索引是对数据库表中一个或多个列的值进行排序的结构,它相当于所有数据目录项的一个集合,能加快数据库的查询速度。索引的主要目的是加快检索表中数据,协助信息搜索者尽快找到符合限制条件的记录ID。
二、类型
数据库索引主要可以分为以下几种类型:
- 主键索引:
- 数据库表中的主键字段,它不仅能够保证数据的唯一性,还可以提高数据查询的效率。
- 主键索引要求值必须是唯一的,且不能为NULL。
- 主键索引是最常用的索引类型,它是在主键字段上自动创建的。
- 唯一索引:
- 与主键索引类似,都是要求索引字段的值必须是唯一的。
- 唯一索引允许有NULL值,而主键索引则不允许。
- 主要作用是防止数据中出现重复的行。
- 普通索引:
- 也叫非唯一索引,它没有任何限制,允许有重复的值,也允许有NULL值。
- 主要用于提高查询速度,它在数据库中创建一个额外的数据结构,这个数据结构包含了对数据的引用,通过它可以快速找到数据。
- 全文索引:
- MySQL中特殊的索引类型,主要用于全文搜索。
- 可以在创建时定义一个语言,这样搜索时就可以忽略该语言中的常用词,提高搜索的准确性。
- 复合索引:
- 在多个字段上创建的索引,可以包含两个或更多的字段。
- 可以提高查询效率,但也需要更多的存储空间和更高的维护成本。
- 迅速、高效:索引可以显著提高数据库查询的速度。
- 唯一性保证:主键索引和唯一索引可以保证数据库表中数据的唯一性。
- 加速连接:索引可以加速表和表之间的连接操作。
- 优化排序和分组:索引可以显著减少查询中分组和排序的时间。
- 占用磁盘空间:索引需要占用额外的磁盘空间来存储。
- 降低写操作性能:索引的创建和维护会增加数据插入、删除和更新的复杂性,从而可能影响写操作的性能。
- 根据查询需求选择合适的索引类型。
- 在经常查询的列上创建索引。
- 避免在更新频繁的列上创建索引,以减少对写操作性能的影响。
- 定期对索引进行重建和优化,以提高查询性能。
相同的SQL执行,左边没加索引,后边添加了索引,效率差了10倍有余(基础数据量为60万)
二、MyISAM存储引擎的索引结构
MyISAM是MySQL的另一个常用存储引擎,它支持的索引结构也是B+树索引,但与InnoDB有所不同。
三、其他索引结构
除了B+树索引外,MySQL还支持其他类型的索引结构,如哈希索引、全文索引等。
四、索引的创建与维护
在MySQL中,可以通过CREATE INDEX
语句来创建索引,也可以通过ALTER TABLE
语句来添加或删除索引。此外,还可以使用SHOW INDEX
语句来查看表的索引信息。
为了保持索引的高效性,需要定期对索引进行维护。例如,当表中的数据发生变化时(如插入、删除或更新操作),可能会导致索引碎片化,从而降低查询性能。在这种情况下,可以考虑重建索引来提高性能。重建索引可以使用OPTIMIZE TABLE
语句或ALTER TABLE ... FORCE
语句来完成。
综上所述,MySQL索引的结构主要依赖于其存储引擎。InnoDB存储引擎支持B+树索引和自适应哈希索引,而MyISAM存储引擎则主要支持B+树索引。此外,MySQL还支持其他类型的索引结构如哈希索引和全文索引等。在创建和维护索引时,需要根据具体的查询需求和数据特点来选择合适的索引类型和创建方式。
-
MySQL索引-结构
-
MySQL索引的结构主要依赖于其存储引擎。在MySQL中,常用的存储引擎如InnoDB和MyISAM都支持索引,但它们的索引实现方式有所不同。以下是MySQL索引结构的主要特点:
一、InnoDB存储引擎的索引结构
InnoDB是MySQL的默认存储引擎,它支持的索引结构主要是B+树索引。
-
B+树索引:
- 结构特点:B+树是一种平衡树,所有叶子节点在同一层,且叶子节点之间通过指针相连形成链表,便于范围查询。
- 优点:
- 查询效率高,特别是范围查询和排序操作。
- 节点内关键字有序排列,便于顺序访问。
- 叶子节点之间通过指针相连,可以高效地进行范围查询。
- 缺点:需要额外的存储空间来存储索引结构。
-
自适应哈希索引:
- InnoDB存储引擎还支持自适应哈希索引。这是一种内存中的数据结构,当InnoDB观察到某些索引页的查询非常频繁时,会自动将这些页转换为哈希索引,以提高查询速度。
- 自适应哈希索引是通过缓存池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。
-
B+树索引:
- 在MyISAM中,B+树的叶子节点存储的是数据记录的地址,而不是数据本身。这意味着在查询时,需要先通过索引找到数据记录的地址,然后再根据地址去访问数据。
- MyISAM的B+树索引不支持聚簇索引,即索引和数据是分开存储的。
-
哈希索引:
- 哈希索引基于哈希表实现,支持等值查询,但不支持范围查询和排序操作。
- 哈希索引的查询速度非常快,通常只需要一次检索即可找到目标记录。
- 然而,哈希索引的缺点是当哈希碰撞发生时,需要处理链表中的多个记录,这可能会降低查询性能。
-
全文索引:
- 全文索引主要用于全文搜索,可以加速对文本字段的查询。
- 全文索引支持自然语言查询和布尔查询等多种查询方式。
- 需要注意的是,全文索引的性能可能会受到文本长度、查询复杂度等因素的影响。
下面我们来看看B+Tree(多路平衡搜索树)结构中如何避免这个问题:
B+Tree结构:
-
每一个节点,可以存储多个key(有n个key,就有n个指针)
-
节点分为:叶子节点、非叶子节点
-
叶子节点,就是最后一层子节点,所有的数据都存储在叶子节点上
-
非叶子节点,不是树结构最下面的节点,用于索引数据,存储的的是:key+指针
-
为了提高范围查询效率,叶子节点形成了一个双向链表,便于数据的排序及区间范围查询
-
-
MySQL索引-语法
-
一、创建索引
在MySQL中,可以使用CREATE INDEX语句或ALTER TABLE语句来创建索引。
使用CREATE INDEX语句创建索引
sql
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (column_name [(length)], ...);
UNIQUE:表示创建唯一索引。唯一索引要求索引列的值必须唯一,允许有空值。
FULLTEXT:表示创建全文索引。全文索引主要用于文本字段的查询,可以提高文本搜索的效率。
SPATIAL:表示创建空间索引。空间索引主要用于地理数据的查询。
index_name:指定索引的名称。索引名称在表中必须是唯一的。
table_name:指定要创建索引的表名。
column_name:指定要创建索引的列名。可以指定一个或多个列作为索引的组合。
(length):可选参数,表示索引的长度。只有字符串类型的字段才能指定索引长度。使用ALTER TABLE语句添加索引
-
sql
ALTER TABLE table_nameADD [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name (column_name [(length)], ...);
该语句的语法与CREATE INDEX类似,但它是通过修改表结构的方式来添加索引。
二、查看索引可以使用SHOW INDEX语句来查看表的索引信息。
sql
SHOW INDEX FROM table_name;
table_name:指定要查看索引的表名。
执行该语句后,将返回表中所有索引的详细信息,包括索引名称、索引类型、列名等。
三、删除索引可以使用DROP INDEX语句或ALTER TABLE语句来删除索引。
使用DROP INDEX语句删除索引
sql
DROP INDEX index_name ON table_name;
index_name:指定要删除的索引名称。
table_name:指定要删除索引的表名。使用ALTER TABLE语句删除索引
sql
ALTER TABLE table_name
DROP INDEX index_name;
该语句也是通过修改表结构的方式来删除索引。
注意事项在创建索引时,应选择合适的列作为索引。通常,经常用于查询条件、排序和分组的列是创建索引的好选择。
索引会占用额外的存储空间,并可能影响写操作的性能。因此,在创建索引时需要权衡查询性能和存储空间之间的平衡。
对于大型表,创建索引可能需要花费一些时间。在创建索引之前,最好先评估其对查询性能的影响。
如果索引不再需要,应及时删除以释放存储空间并提高写操作的性能。通过以上语法和注意事项,您可以在MySQL中灵活地创建、查看和删除索引,以优化数据库的查询性能。
二、基于索引组织方式的分类
三、基于索引功能的分类
四、基于索引字段个数的分类
五、其他特殊类型的索引
-
MySQL索引-分类
-
一、基于索引数据结构的分类
- B-Tree索引:
- 最常见的索引类型。
- 实现基于B树或B+树结构。
- 索引节点按排序顺序链接,适合范围查询。
- 适用于单值查询、范围查询、前缀匹配(如LIKE 'abc%')、排序查询等。
- Hash索引:
- 基于哈希表进行查找。
- 每个键通过哈希函数计算并映射到一个唯一的哈希值来加速等值查询。
- 适用于等值查询,但不适合范围查询和排序。
- Full-text索引:
- 用于在较大的文本字段中查找关键字。
- 支持自然语言搜索模式和布尔模式。
- 主要用于查找包含特定词汇的文本,如文章、博客、评论等。
- 空间索引(R-Tree索引):
- 使用R树数据结构。
- 适用于地理空间数据的快速查找。
- 通常与GIS(地理信息系统)功能结合。
- 聚簇索引(Clustered Index):
- 将数据行存储与索引叶节点结合。
- 物理上按索引顺序存储数据。
- 每张表只能有一个聚簇索引(通常是主键)。
- 适用于频繁按主键查询或按顺序读取大量数据的场景。
- 非聚簇索引(二级索引/辅助索引):
- 存储独立于主键的索引。
- 包含指向主键的指针以便找到完整的行数据。
- 适用于对非主键列进行频繁查找的场景。
- 普通索引:
- 没有任何限制条件的索引。
- 仅用来提高查询速度。
- 唯一索引(UNIQUE Index):
- 要求索引列的所有值都必须唯一。
- 允许有空值,但空值不计入唯一性约束。
- 主键索引(PRIMARY KEY):
- 建立在主键上的索引。
- 自动创建,一个表只能有一个主键索引。
- 主键索引也是唯一索引的一种特殊形式。
- 全文索引(FULLTEXT Indexes):
- 如前所述,用于文本字段的关键字查找。
- 空间索引(Spatial Indexes):
- 如前所述,用于地理空间数据的查找。
- 单列索引:
- 建立在单个列上的索引。
- 组合索引(复合索引/多列索引):
- 建立在多个列上的索引。
- 可以提高涉及多个列的查询性能。
- 遵循最左前缀原则,即查询时会先使用索引中最左边的列进行比较。
- 自适应哈希索引(Adaptive Hash Index):
- InnoDB引擎的优化机制。
- 自动为热点数据创建哈希索引,提升查询性能。
- 前缀索引:
- 对字符串类型字段的前部分创建索引。
- 可以减少索引占用的空间,并提高查询效率。
- 覆盖索引:
- 包含所有需要查询的字段值的索引。
- 只需扫描索引而无须回表查询。
- 降序索引:
- 支持索引列的降序存储。
- 在创建索引时可以指定列的排序方式(ASC或DESC)。
- 不可见索引:
- 优化器未使用的索引。
-
可以将索引设置为不可见,以避免其对查询性能的影响。当需要时,可以再将索引设置为可见。
六、数据库概念
1.存储和操作数据库的仓
2.本质:一个文件系统,对数据的操作就是对文件的操作【IO操作】
3.是什么?用于存储和操作数据的文件系统
一、基本概念
关系型数据库的核心是关系模型,它使用表格(table)来存储数据,每个表格由行(row)和列(column)组成。行代表记录,列代表字段。数据表之间通过关系(如外键)相互关联,形成一个完整的数据库系统。
二、主要特点
- 数据模型简单:关系型数据库使用二维表格来表示数据,逻辑清晰,易于理解。
- 结构化存储:数据按照预定的结构存储在表格中,保证了数据的一致性和完整性。
- 数据冗余低:通过关系表中的外键约束和参照完整性,可以有效地减少数据冗余。
- 使用SQL语言:关系型数据库使用统一的SQL(Structured Query Language,结构化查询语言)进行数据查询和操作,提高了数据库的通用性和易用性。
- 安全性高:关系型数据库支持访问控制和权限管理,能够保护数据的安全。
三、主要优势
- 易于理解:关系型数据库采用二维表格来表示数据,这与人们的逻辑思维习惯相符,使得数据库的设计和使用更加直观和简单。
- 支持复杂查询:关系型数据库支持复杂的SQL查询,包括连接查询、子查询、嵌套查询等,可以满足各种复杂的业务需求。
- 事务支持:关系型数据库支持事务处理,保证了数据的一致性和完整性。事务可以看作是一个逻辑单元,包含多个数据库操作,这些操作要么全部成功,要么全部失败。
- 易于维护:关系型数据库的结构化存储和关系约束使得数据维护更加容易。同时,关系型数据库还支持各种数据备份和恢复技术,确保数据的可靠性和安全性。
四、主要劣势
- 扩展性差:传统的关系型数据库在处理大规模数据和高并发访问时可能存在性能瓶颈。虽然可以通过横向扩展(如分片、分布式数据库等)来提高性能,但这会增加系统的复杂性和维护成本。
- 存储成本高:关系型数据库通常需要较大的存储空间来存储数据,并且随着数据量的增加,存储成本也会相应增加。
- 处理复杂数据结构困难:关系型数据库对于处理复杂的数据结构(如多对多关系、嵌套数据结构等)可能不够灵活。虽然可以通过创建多个关联表或使用JSON等数据类型来解决这些问题,但这会增加数据库的复杂性和查询难度。
五、常见的关系型数据库类型
- Oracle:由甲骨文公司开发的关系型数据库管理系统,具有分布式数据库、对象关系数据库、高性能、高可用性、高安全性、易于管理等特性。
- MySQL:一种开源的关系型数据库管理系统,具有高性能、可扩展性强、易于使用、支持多种操作系统和存储引擎等特点。MySQL是中小型应用和网站的首选数据库之一。
- SQL Server:由微软公司开发和推出的关系型数据库管理系统,包含了大量的企业级功能,如高级安全性、事务处理、分布式数据库、分析服务、集成服务、报告服务等。SQL Server与.NET环境紧密结合,适合在Windows环境下使用。
- DB2:由IBM公司开发的关系型数据库管理系统,支持最新的SQL标准,并提供了大量的内置函数,可以处理复杂的事务和查询。DB2具有高性能、高可靠性、强大的数据处理能力等特点。
- PostgreSQL:一种强大的开源关系型数据库系统,提供了SQL语言的完整实现,并且支持许多现代的数据库特性,如复杂的查询、外键、触发器、视图、事务完整性、多版本并发控制等。PostgreSQL还支持GIS数据类型和函数等高级特性。
六.库表结构操作
1.一般图形化
mysql:SQLyog,Navicat,DataGrail,
Oracle:Navicat,DataGrail,PL Store
二、数据操作语言(DML)
DML语句主要用于对数据库中的数据进行增删改查操作。以下是一些常见的DML语句:
INSERT:用于向表中插入新数据。
sql
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
UPDATE:用于修改表中的现有数据。
sql
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
DELETE:用于删除表中的数据。
sql
DELETE FROM table_name
WHERE condition;
SELECT:用于从数据库中查询数据。
sql
SELECT column1, column2, ...
FROM table_name
WHERE condition;
DQL(数据查询语言)
SELECT
- 基础查询:使用SELECT语句从表中检索数据。
- 条件查询:通过WHERE子句添加条件,以筛选满足特定条件的记录。
- 排序:使用ORDER BY子句对查询结果进行排序。
- 分组与聚合:使用GROUP BY子句对数据进行分组,并使用聚合函数(如SUM、COUNT、AVG等)计算每组的数据。
- 连表查询:
- INNER JOIN:返回两个表中匹配的记录。
- LEFT JOIN(或LEFT OUTER JOIN):返回左表中的所有记录以及右表中匹配的记录;如果右表中没有匹配的记录,则结果中右表的部分将包含NULL。
- RIGHT JOIN(或RIGHT OUTER JOIN):与LEFT JOIN相反,返回右表中的所有记录以及左表中匹配的记录。
- FULL JOIN(或FULL OUTER JOIN):返回两个表中所有匹配的记录,以及每个表中不匹配的记录(使用NULL填充缺失的部分)。
- 子查询:在另一个查询的WHERE子句或SELECT列表中嵌套一个查询。
- 合并结果:
- UNION:合并两个或多个SELECT语句的结果集,并去除重复的行。
- UNION ALL:与UNION类似,但不去除重复的行。
DML(数据操作语言)
INSERT
- 插入单条记录:使用INSERT INTO语句向表中插入一行数据。
- 批量插入:在MySQL中,可以通过在VALUES子句中指定多个值对来一次性插入多行数据。
UPDATE
- 更新记录:使用UPDATE语句修改表中的现有记录。务必在WHERE子句中指定条件,以避免意外更新所有记录。
DELETE
- 删除记录:使用DELETE语句从表中删除记录。同样,务必在WHERE子句中指定条件,以避免删除所有记录。
注意事项
作用
- 数据完整性:在进行DML操作时,应确保遵守数据库的约束(如主键、外键、唯一性约束等),以保持数据的完整性和一致性。
- 事务管理:对于涉及多条DML语句的操作,应考虑使用事务来确保数据的原子性、一致性、隔离性和持久性(ACID属性)。
- 备份与恢复:在进行大规模DML操作之前,应备份数据库,以便在出现意外时能够恢复数据。
- 安全性:防止SQL注入攻击,通过使用参数化查询、预编译语句或ORM框架等最佳实践来确保输入数据的安全性。
-
创建概念数据模型(CDM)
- 打开PowerDesigner,选择“File”->“New Model”,然后选择“Conceptual Data Model”来创建一个新的概念数据模型。
- 使用Palette面板中的工具来创建实体(Entity)和设置实体属性。实体代表数据库中的表,属性代表表中的字段。
- 通过Palette面板中的Relationship工具为实体之间添加关系,如一对多、多对一等。
- 根据业务需求,不断完善和调整概念数据模型。
-
由CDM生成物理数据模型(PDM)
- 在PowerDesigner中,选择“Tools”->“Generate Physical Data Model”来将概念数据模型转换为物理数据模型。
- 在转换过程中,需要选择目标数据库管理系统(DBMS),如MySQL、Oracle等。
- 根据需要,对生成的物理数据模型进行微调和优化。
-
由PDM生成SQL文件
- 在PowerDesigner中,选择“Database”->“Generate Database”来生成SQL脚本。
- 在弹出的对话框中,设置SQL脚本的保存路径和文件名。
- 根据需要,选择生成SQL脚本的详细信息和要导出的对象(如表、视图等)。
- 点击确定,生成SQL文件。
-
将SQL文件导入数据库
- 使用数据库管理工具(如MySQL Workbench、phpMyAdmin等)或命令行工具(如mysql命令行客户端)将生成的SQL文件导入到数据库中。
- 在导入过程中,需要确保数据库连接正确,并有足够的权限来执行导入操作。
-
方便构建数据模型:
- PowerDesigner提供了丰富的工具和功能,使得构建数据模型变得更加简单和高效。
- 通过可视化界面,可以直观地看到实体之间的关系和数据结构,有助于更好地理解和设计数据库。
-
提高开发效率:
- 使用PowerDesigner进行数据库建模,可以大大减少手动编写SQL脚本的时间和工作量。
- 通过自动生成SQL文件并导入数据库,可以快速搭建起数据库环境,为后续的开发工作提供有力支持。
-
保证数据一致性和完整性:
- 在建模过程中,可以设置各种约束和规则(如主键、外键、唯一性约束等),以确保数据的一致性和完整性。
- 这些约束和规则在生成SQL文件和导入数据库时会自动应用,从而有效地防止数据错误和异常。
-
便于维护和调整:
- 使用PowerDesigner进行数据库建模,可以方便地修改和调整数据模型。
- 当业务需求发生变化时,只需在模型中进行相应的修改,然后重新生成SQL文件并导入数据库即可。
-
数据类型
- int:整数类型,用于存储整数值。
- tinyint:非常小的整数类型,通常用于存储有限范围的整数值,如性别(0女、1男、2保密)。
- bigint:大整数类型,通常用于存储非常大的整数值,如主键(特别是使用雪花算法生成的主键)。
- varchar:可变长度字符串类型,实际存储长度与数据长度一致,适用于长度不固定的字符串。
- char:固定长度字符串类型,实际存储长度与设定长度一致,适用于长度固定的字符串。
- date:日期类型,通常用于存储出生年月日等日期信息。
- datetime:日期和时间类型,通常用于存储创建时间等同时包含日期和时间的信息(但需注意,在某些场景下可能更倾向于使用timestamp类型)。
- text:长文本类型,用于存储大量文本数据。
- double、float:浮点数类型,用于存储小数或近似数值。
- decimal:定点数类型,用于存储精确的小数,如财务数据。
-
CRUD操作
- insert:插入操作,用于向表中添加新记录。
insert into 表名 (字段列表) values (值列表)
:插入单条记录。insert into 表名 (字段列表) values (值列表),(值列表),...
:插入多条记录。
- delete:删除操作,用于从表中删除记录。
delete from 表名 where 条件
:根据条件删除记录。- 逻辑删除:通过更新一个标记字段(如
is_delete
)来表示记录是否被删除,而不是真正从数据库中删除。
- update:更新操作,用于修改表中的现有记录。
update 表名 set 字段1=值1, ... where 条件
:根据条件更新记录。
- select:查询操作,用于从表中检索数据。
- 避免使用
*
来检索所有字段,而是指定需要的字段以提高查询效率。 - 可以使用聚合函数(如
count(*)
)进行统计。
- 避免使用
-
SQL执行顺序
- 单表查询:
from
:指定查询的表。where
:应用过滤条件。group by
:对结果进行分组。- 聚合函数:对分组后的数据进行计算。
having
:对聚合后的结果进行过滤。select
:选择需要显示的字段。distinct
:去除重复的记录。order by
:对结果进行排序。limit
:限制返回的记录数。
- 连表查询:
from
:指定查询的表,并通过join...on
进行连接。join...on
:指定连接条件和连接类型(如inner join
、left join
等)。where
:应用过滤条件。group by
、聚合函数、having
、select
、distinct
、order by
、limit
:与单表查询相同。
- 内连接(inner join):
- 显示两个表中符合条件的数据,即交集部分。
- 左外连接(left join 或 left outer join):
- 左表显示全部记录,右表根据连接条件匹配,不匹配则以NULL值填充。
- 子查询:
- 在一个查询中嵌套另一个查询。
- 尽量避免在可以使用连接查询的情况下使用子查询,除非子查询能够显著减少数据量(如减少笛卡尔积)。
- 结果使用:
- 子查询返回一个值时,可以使用
=
进行比较。 - 子查询返回多个值时,可以使用
in
进行比较。
- 子查询返回一个值时,可以使用
一、视图(View)
定义:视图是一种虚拟表,它基于一个或多个基本表(或其它视图)的行和列定义的一种逻辑表现形式。它并不实际存储数据,而是根据SQL语句获取动态的数据集,并为其命名。
创建:使用CREATE VIEW语句创建视图。例如:
sql
CREATE VIEW 视图名称 AS SELECT 语句;
作用:
辅助查询:视图可以简化复杂的查询逻辑,将常用的查询封装为视图,方便重复使用。
提升查询性能:通过视图,可以只查询所需的数据,避免不必要的全表扫描,从而提升查询性能。
屏蔽敏感数据:视图可以隐藏原表中的敏感数据,只展示需要的数据字段。
主分同步:在主从复制的场景中,视图可以用于从库上的查询,确保数据实时同步且查询性能良好。
注意事项:
视图中的数据依赖于原表的数据,一旦原表数据发生改变,视图中的数据也会相应改变。
一般情况下,不建议对视图进行增删改操作,因为这会直接作用于原表数据。如果确实需要修改视图中的数据,可以通过更新原表来实现。
视图可以设置为只读,以防止对原表数据进行意外的修改。
二、伪表(Pseudo-Table)
定义:伪表,又称为虚拟表或临时表,是不存在于数据库的物理存储中、不保存任何数据、只在查询时动态生成、只存在于查询期间的一种特殊表。
特点:
不占用存储空间:伪表没有实体,不会占用数据库的存储空间。
无法直接进行数据插入、更新或删除操作:伪表中的数据是临时的,一旦查询结束,数据就会被清空。
通常用于存储临时数据或作为查询的中间结果。
应用:伪表在处理大量数据时具有很高的效率,因为它无需消耗存储资源。同时,由于伪表只是临时的,所以它能有效避免因数据操作而导致的数据冗余问题。
三、存储过程(Stored Procedure)
定义:存储过程是一组为了完成特定功能的SQL语句集合。它类似于一个方法或函数,可以接受参数并返回结果。
创建:使用CREATE PROCEDURE语句创建存储过程。例如:
sql
CREATE PROCEDURE 存储过程名称 (参数列表)
BEGIN
-- SQL语句集合
END;
作用:
封装复杂的业务逻辑:存储过程可以将复杂的SQL查询或操作封装为一个简单的过程调用。
提高性能:通过减少网络传输和数据库连接次数,存储过程可以提高数据库操作的性能。
增强安全性:存储过程可以限制用户对数据库的直接访问,从而增强数据库的安全性。
注意事项:
存储过程通常包含复杂的逻辑,随着业务逻辑的增加,存储过程的复杂性也会不断增加,导致维护成本高。
存储过程的调试通常比应用程序代码更困难。
存储过程的版本控制和变更管理相对复杂。
在某些情况下,存储过程可能会绕过应用程序的数据隔离机制,导致数据安全问题。
阿里巴巴Java开发手册建议:由于存储过程在可维护性、可移植性、性能、安全性和开发效率等方面存在的问题,阿里巴巴Java开发手册建议使用其他替代方案来替代存储过程的使用。例如,可以使用触发器、函数或应用程序代码来实现相同的业务逻辑。
InnoDB 和 MyISAM 是 MySQL 中的两种常见存储引擎,它们之间存在多个显著的区别。以下是对这两种存储引擎的详细对比:
InnoDB | MyISAM | |
---|---|---|
事务支持 | 支持 | 不支持 |
锁机制 | 行级锁(支持高并发) | 表级锁(并发性能较低) |
外键支持 | 支持 | 不支持 |
全文索引 | 早期版本不支持,但后续版本已支持 | 支持 |
数据恢复 | 提供事务日志,支持崩溃恢复 | 不支持崩溃恢复 |
存储限制 | 表大小受文件系统限制 | 支持较大的表 |
索引类型 | 聚簇索引(主键索引是聚簇的,非主键索引是非聚簇的) | 非聚簇索引(索引和数据文件分离) |
数据文件与索引文件 | 索引和数据存储在同一个.ibd文件中 | 数据存储在.myd文件中,索引存储在.myi文件中 |
适用场景 | 需要事务处理、高并发、数据完整性要求较高的场景 | 读多写少、对并发性能要求不高的场景 |
InnoDB 的特点与优势
- 事务支持:InnoDB 支持 ACID 事务特性,即原子性、一致性、隔离性和持久性。这确保了数据操作的完整性和可靠性。
- 行级锁:通过行级锁定,InnoDB 能够支持更高的并发性能,适合处理大量并发读写操作。
- 外键支持:InnoDB 支持外键约束,能够维护数据的参照完整性。
- 崩溃恢复:InnoDB 提供了事务日志和崩溃恢复机制,能够在系统崩溃后自动恢复数据。
MyISAM 的特点与优势
- 读取性能:MyISAM 在读取大量数据时通常比 InnoDB 更快,因为其表级锁定策略减少了锁定的开销。
- 存储空间:MyISAM 通常比 InnoDB 占用更少的磁盘空间,因为它不存储行级锁定信息和事务日志。
- 全文索引:MyISAM 支持全文索引,适合文本搜索类应用。
选择建议
- 在需要事务支持、高并发、数据完整性要求较高的场景中,优先选择 InnoDB。
- 在读多写少、对并发性能要求不高的场景中,可以考虑使用 MyISAM。但需要注意的是,随着 MySQL 版本的发展,InnoDB 已经成为默认的存储引擎,并且在性能和功能上得到了不断的优化和提升。因此,在大多数情况下,建议使用 InnoDB 作为存储引擎。