InnoDB一点零散的知识点

本文探讨了在外键不加索引时可能导致的数据库死锁问题,以及如何通过添加索引来解决这一问题。此外,还详细介绍了InnoDB存储引擎中的聚集索引、辅助索引及联合索引的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外键不加索引会引起死锁的问题

情景
主表parent主键id,字表child主键cid,cid为parent外键,和parent中id来源一致
当对parent或者child进行删除操作时,如果外键没有索引,数据库就会将行锁升级为表锁,从而可能导致大量的等待和死锁
大多数数据库现在致力于解决这个问题,但也只是降低了这种情况下死锁的风险,并没有完全消除
解决
外键加上索引就可以了,事实表明,这种方式最有效


InnoDB聚集索引和辅助索引(二级索引)

1.InnoDB采用B+树实现索引,默认会在每个表的主键加上聚集索引,这种索引中,数据物理上不是连续存放(我们的教程有误解),但逻辑上是连续的。
2.InnoDB聚集索引中,B+的深度一般在2到3层,叶子节点会存放数据的所有值(完全行数据)
3.辅助索引仅会在B+树叶子节点存放当前列的值和主键的索引键,通过这个找到聚集索引中改行数据
4.聚集索引中每个叶子节点是物理上一页(InnoDB最小的物理存储单位)的数据,找到这个页之后,根绝这个页的 page directory二分找到所需要的数据(InnoDB聚集索引是按照主键有序存放数据的)


InnoDB联合索引

    联合索引实际上是对创建索引的这几列做排序,使用联合索引的时候,先根据第一个索引去找,找到再根据第二个索引去找,依次下去,这样的查找逻辑,可以保证按照顺序查找
    如果不是这样的顺序,InnoDB优化器可能就不会使用联合索引,这就是所谓的联合索引的最左原则。因为如果从第二列或者第三列开始的话,可能就不会是有序的。
例子是这样的(网上找的例子,意思是一样的)
    假设数据 表T (a,b,c) rowid 为物理位置
rowid a b c
(1) 1 1 1
(2) 2 1 13
(3) 2 2 14
(4) 1 3 3
(5) 2 3 12
(6) 1 2 5
(7) 2 3 9
(8) 1 2 2
(9) 1 3 6
(10) 2 2 11
(11) 2 2 8
(12) 1 1 7
(13) 2 3 15
(14) 1 1 4
(15) 2 1 10


当你创建一个索引 create index xxx on t(a,b), 则索引文件逻辑上等同于如下
a b rowid
1 1 1
1 1 12
1 1 14
1 2 6
1 2 8
1 3 4
1 3 9
2 1 2
2 1 15
2 2 3
2 2 10
2 2 11
2 3 5
2 3 7
2 3 13
再根据上边的查找逻辑去看看这个索引,是不是就一目了然呢
<think>好的,我现在需要全面总结SQL相关的知识点。首先,我得回顾一下用户提供的引用内容,看看有哪些部分需要涵盖进去。用户提到了几个引用,包括基本的查询语句、PL/SQL知识、truncate语句、SQL注入、以及事务和锁机制等。 首先,我应该从SQL的基础开始,比如数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)和数据控制语言(DCL)。这些是SQL的核心组成部分,每个部分都有不同的命令和用途。例如,DDL包括CREATE、ALTER、DROP,而DML包括INSERT、UPDATE、DELETE等。 接下来是查询语句,特别是SELECT语句,用户引用中的例子使用了LIKE操作符和通配符,比如'z%'。这部分需要详细说明各种操作符和函数的使用,比如WHERE子句、JOIN的类型(内连接、左连接、右连接、全外连接),以及聚合函数如COUNT、SUM等。 然后是事务管理,用户提到了ACID特性、事务隔离级别(读未提交、读已提交、可重复读、串行化),以及可能的问题如脏读、不可重复读、幻读。此外,锁机制也是重点,包括表级锁、行级锁、页级锁的特点和应用场景,以及不同存储引擎如MyISAM和InnoDB的区别。 PL/SQL部分需要涵盖变量声明、流程控制(条件语句、循环)、游标的使用、存储过程和函数的编写,以及触发器的应用。用户提供的引用中提到了标识符命名规则、注释方法、数据类型转换等,这些都需要详细说明。 数据安全和SQL注入也是不可忽视的部分。需要解释如何防范注入攻击,比如使用参数化查询,避免动态拼接SQL语句。用户引用中提到的正则表达式检测注入的方法可能是一个例子,但更重要的预防措施需要强调。 此外,高级特性如视图、索引优化、分区表、存储引擎的区别(如InnoDB支持事务,而MyISAM不支持)都需要提及。性能优化方面,可以讨论执行计划分析、索引的最佳实践、避免全表扫描等。 最后,用户可能需要了解不同数据库系统的扩展和差异,比如Oracle、MySQL、SQL Server在语法和功能上的不同之处。不过根据引用内容,重点可能在MySQL和Oracle的PL/SQL部分。 在组织内容时,需要确保结构清晰,分门别类,每个部分用标题和子标题划分。同时,按照用户的要求,数学公式用$...$,独立公式用$$...$$,但根据当前内容可能数学公式较少,主要关注SQL语法和概念。引用部分需要正确标注,例如事务的问题和锁机制引用自[^5],PL/SQL知识点引用自[^2]等。 现在需要检查是否有遗漏的部分,比如数据类型、约束(主键、外键、唯一约束、检查约束)、子查询、集合操作(UNION、INTERSECT)、窗口函数等。这些内容虽然用户没有直接提到,但全面的SQL总结应该包括这些基础内容。 另外,用户提到的truncate table语句属于DDL,与delete的区别在于truncate是删除所有数据且不能回滚,而delete可以带条件删除并且可以回滚,这一点需要说明,引用自[^3]。 总结来说,结构大致如下: 1. SQL基础:组成、数据类型、约束 2. DDL、DML、DQL、DCL的具体命令和示例 3. 查询进阶:JOIN、子查询、聚合函数、分组、排序 4. 事务和并发控制:ACID、隔离级别、锁机制 5. 存储引擎对比:MyISAM vs InnoDB 6. PL/SQL基础:块结构、变量、流程控制、游标、存储过程、触发器 7. 数据安全和SQL注入防范 8. 性能优化:索引、执行计划、查询优化 9. 高级特性:视图、索引类型、分区 10. 不同数据库系统的差异 确保每个部分都涵盖用户引用中的内容,并适当补充相关知识。例如,在事务部分详细说明不可重复读、幻读等问题,并引用。在锁机制中说明不同锁级别的特点,引用[^5]。在PL/SQL部分说明标识符命名和注释方法,引用[^2]。 现在需要将这些内容以清晰的中文结构呈现,使用适当的代码块展示SQL示例,如SELECT语句、存储过程结构等。同时,注意使用正确的LaTeX格式,比如在解释索引结构时如果有数学表达式,需要用$...$包裹。 最后生成相关问题,覆盖用户可能感兴趣的进阶内容,比如优化方法、应用场景、锁机制对比等。</think>### SQL 知识点全面总结 --- #### 一、SQL 基础 1. **SQL 组成** - **数据定义语言 (DDL)**: - `CREATE`: 创建表、视图、索引等,例如: ```sql CREATE TABLE stu (id INT PRIMARY KEY, sname VARCHAR(50)); ``` - `ALTER`: 修改表结构 - `DROP`: 删除对象 - `TRUNCATE`: 快速清空表数据(不可回滚)[^3] - **数据操作语言 (DML)**: - `INSERT`: 插入数据 - `UPDATE`: 更新数据 - `DELETE`: 删除数据(可条件筛选) - **数据查询语言 (DQL)**: - `SELECT`: 查询数据,例如: ```sql SELECT * FROM stu WHERE sname LIKE 'z%'; -- 匹配以 z 开头的名字[^1] ``` - **数据控制语言 (DCL)**: - `GRANT`: 授权 - `REVOKE`: 撤销权限 2. **数据类型与约束** - 常见类型:`INT`, `VARCHAR`, `DATE`, `BOOLEAN` - 约束:主键 (`PRIMARY KEY`)、外键 (`FOREIGN KEY`)、唯一 (`UNIQUE`)、非空 (`NOT NULL`) --- #### 二、查询进阶 1. **JOIN 操作** - 内连接 (`INNER JOIN`): 仅返回匹配行 - 左/右外连接 (`LEFT/RIGHT JOIN`): 保留左/右表所有行 - 全外连接 (`FULL OUTER JOIN`): 返回所有匹配和非匹配行 2. **聚合与分组** - 聚合函数:`COUNT()`, `SUM()`, `AVG()`, `MAX()`, `MIN()` - `GROUP BY`: 按列分组,常与聚合函数联用 - `HAVING`: 对分组结果筛选 3. **子查询与集合操作** - 子查询示例: ```sql SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` - 集合操作:`UNION`, `INTERSECT`, `EXCEPT` --- #### 三、事务与并发控制 1. **ACID 特性** - 原子性 (Atomicity): 事务完全执行或完全不执行 - 一致性 (Consistency): 事务前后数据状态合法 - 隔离性 (Isolation): 并发事务互不干扰 - 持久性 (Durability): 提交后数据永久保存 2. **事务隔离级别** - 读未提交(脏读、不可重复读、幻读) - 读已提交(解决脏读) - 可重复读(解决不可重复读,MySQL 默认) - 串行化(解决幻读,性能最低) 3. **锁机制** - **表级锁**(MyISAM): 开销小,但并发低 - **行级锁**(InnoDB): 开销大,支持高并发 - **页级锁**: 介于表锁和行锁之间 --- #### 四、PL/SQL 编程 1. **基础结构** - 块结构:`DECLARE`(声明)、`BEGIN`(执行)、`EXCEPTION`(异常) - 变量声明与赋值: ```sql DECLARE v_name VARCHAR2(50) := 'Alice'; BEGIN SELECT sname INTO v_name FROM stu WHERE id = 1; END; ``` 2. **流程控制** - 条件语句:`IF-THEN-ELSE` - 循环:`LOOP`, `WHILE`, `FOR` 3. **存储过程与触发器** - 存储过程示例: ```sql CREATE PROCEDURE GetStudent(IN id INT) BEGIN SELECT * FROM stu WHERE id = id; END; ``` - 触发器:在事件(如 `INSERT`)前后自动执行 --- #### 五、性能优化与安全 1. **索引优化** - 类型:B-Tree、哈希、全文索引 - 最佳实践:避免过多索引,优先为高频查询字段建索引 2. **防范 SQL 注入** - 使用参数化查询: ```sql PREPARE stmt FROM 'SELECT * FROM users WHERE name = ?'; EXECUTE stmt USING @username; ``` - 避免动态拼接 SQL[^4] --- #### 六、存储引擎对比(MyISAM vs InnoDB)[^5] | 特性 | MyISAM | InnoDB | |--------------------|-----------------|-----------------| | **事务支持** | ❌ | ✔️ | | **行级锁** | ❌(仅表锁) | ✔️ | | **外键支持** | ❌ | ✔️ | | **崩溃恢复** | 较弱 | 强(事务日志) | | **适用场景** | 读密集型 | 读写混合型 | --- §§ 相关问题 §§ 1. 如何优化慢查询的性能? 2. 索引失效的常见原因有哪些? 3. 如何设计数据库以支持高并发场景? 4. 在PL/SQL中如何处理异常?[^2] 5. MySQL的MVCC机制如何实现可重复读?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值