超键、候选键、主键、外键
-
超键(Superkey):假设我们有一个学生信息表,其中包含学生ID、姓名和手机号码等信息。在这个表中,{学生ID} 和 {姓名, 手机号码} 都可以作为超键,因为它们都能唯一标识每个学生的信息。
-
候选键(Candidate Key):在学生信息表中,{学生ID} 是一个候选键,因为它是最小超键,没有冗余的属性。换句话说,如果我们移除任何一个属性,它就不再是超键了。
-
主键(Primary Key):在学生信息表中,我们可以选择学生ID作为主键。主键是用来唯一标识表中每个记录的键,而且主键的值不能重复,也不能为空值。通过指定主键,我们可以确保每个学生ID在表中都是唯一的,而且不能为空。
-
外键(Foreign Key):假设我们有另一个表格,存储着学生的成绩信息。在成绩表中,我们可以包含一个指向学生信息表的外键,比如学生ID。这样,成绩表中的每一条记录都可以与学生信息表中的某个学生相关联。
为什么用自增列作为主键
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新记录都要被插到现有索引页的中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
触发器的作用
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
假设我们有一个名为 "employees" 的表,存储了公司员工的信息,其中包括员工的工资信息。我们希望在向该表中插入新记录时,自动检查员工的工资是否超过了预设的最大工资限额,如果超过了,则阻止插入操作,并记录一条警告信息。
我们可以创建一个触发器来实现这个功能。下面是一个简单的示例:
```sql
-- 创建一个名为 check_salary_trigger 的触发器
CREATE TRIGGER check_salary_trigger
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN-- 检查新插入记录的工资是否超过了最大工资限额(假设为 10000)IF NEW.salary > 10000 THEN-- 如果工资超过了限额,则阻止插入操作,并输出警告信息SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Salary exceeds maximum limit!';END IF;
END;
```
在上面的示例中,我们创建了一个名为 "check_salary_trigger" 的触发器,它在每次向 "employees" 表中插入新记录之前触发。在触发器中,我们使用条件语句检查新插入记录的工资是否超过了预设的最大限额(10000)。如果超过了限额,则触发器会发出一个信号,阻止插入操作,并输出一条警告信息。
通过这种方式,我们可以利用触发器实现对数据的自动检查和处理,确保数据的完整性和准确性。
什么是存储过程?用什么来调用
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
调用:
1)可以用一个命令对象来调用存储过程。
2)可以供外部程序调用,比如:java程序。
优点:
1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,可减少数据库开发人员的工作量。
缺点:
移植性差
存储过程(Stored Procedure)和函数(Function)是数据库中常用的两种可重复使用的代码块,它们有以下区别:
-
返回值类型:
- 存储过程可以不返回值,也可以返回多个结果集,甚至可以修改数据库中的数据,但它不能直接作为表达式的一部分调用。
- 函数必须返回一个值,并且可以像普通表达式一样被调用和使用,可以作为查询语句的一部分。
-
用法:
- 存储过程通常用于执行一系列的 SQL 语句或处理逻辑,常见用途包括数据处理、业务逻辑、数据验证等。
- 函数通常用于执行某种特定的计算或处理,并返回一个值。例如,可以用函数计算两个数的平均值或者判断一个日期是否为工作日。
-
调用方式:
- 存储过程可以通过 SQL 语句的 CALL 或 EXECUTE 命令来调用,也可以通过应用程序代码直接调用。
- 函数通常可以像普通表达式一样调用,可以在 SELECT 语句或 WHERE 子句中使用。
-
作用域:
- 存储过程通常是与数据库关联的,它们可以访问数据库中的数据和对象。
- 函数可以是与数据库关联的,也可以是与数据库无关的。在某些数据库管理系统中,函数可以访问数据库中的数据和对象,但在其他数据库管理系统中,函数可能只能访问函数定义所在的特定数据库。
什么是视图
视图(View)是数据库中的一种虚拟表,它是基于一个或多个实际表(或其他视图)的查询结果集合,并且可以像表一样被查询和操作。视图不存储实际的数据,而是根据定义的查询语句动态地生成数据。
假设我们有一个数据库中的两个表:`Employee`(员工信息)和`Department`(部门信息)。`Employee`表包含员工的ID、姓名和部门ID等信息,而`Department`表包含部门的ID和名称等信息。
现在,我们可以创建一个名为`EmployeeDetails`的视图,用来显示员工的详细信息,包括员工的姓名、部门名称等。下面是一个示例 SQL 查询来创建这个视图:
```sql
CREATE VIEW EmployeeDetails AS
SELECT e.EmployeeID, e.EmployeeName, d.DepartmentName
FROM Employee e
JOIN Department d ON e.DepartmentID = d.DepartmentID;
```
通过这个视图,我们可以方便地查询员工的详细信息,而不必直接操作原始的`Employee`和`Department`表。例如:
```sql
SELECT * FROM EmployeeDetails;
```
这条查询会返回一个包含员工的ID、姓名和部门名称的结果集,而不必关心具体的表结构和关联逻辑。
优点:
可选,操作简单,维护数据独立性,可以产生多种视图
1对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
2)用户通过简单的查询可以从复杂查询中得到结果。
3)维护数据的独立性,试图可从多个表检索数据。
4)对于相同的数据可产生不同的视图。
缺点:
性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据
查询仍然是对基本表的查询。
游标
游标允许程序逐行访问查询结果,并且可以对结果集进行随机访问、更新和删除等操作。
drop、truncate、 delete区别
drop 删除整个表 执行DROP命令后,表及其相关的所有内容都将被永久删除,无法恢复。
truncate命令用于删除表中的所有数据,但保留表的结构。 TRUNCATE命令在删除数据时不会激活触发器。
delete命令用于删除表中的一行或多行数据,可以通过WHERE子句指定要删除的行。
- DROP用于删除整个表,包括结构和数据;
- TRUNCATE用于删除表中的所有数据,但保留表的结构;
- DELETE用于删除表中的一行或多行数据,可根据条件选择性删除数据。
什么是临时表,临时表什么时候删除
临时表(Temporary Table)是在数据库中用于存储临时数据的表,它的生命周期在会话结束时或在事务结束时结束。临时表通常用于存储中间结果或临时数据,它们在一段时间内存在,完成了任务后会自动删除,不会占用数据库中的永久存储空间。
非关系型数据库和关系型数据库区别,优势比较?
关系型数据库(RDBMS):
- 结构化数据存储:关系型数据库使用表格(表)来存储数据,数据以行和列的形式组织,具有严格的结构化模式。
- SQL支持:使用结构化查询语言(SQL)进行数据操作和查询,SQL语言规范化,易于学习和使用。
- 事务支持:支持事务(Transaction)的特性,具有 ACID(原子性、一致性、隔离性、持久性)特性,确保数据的完整性和一致性。
- 数据一致性:数据之间的关系通过外键等约束保证了数据的一致性和完整性。
- 强大的查询能力:支持复杂的查询操作,包括连接(Join)、聚合(Aggregate)等操作。
非关系型数据库(NoSQL):
- 灵活的数据模型:非关系型数据库采用了灵活的数据模型,如文档型、键值对、列族等,可以存储半结构化或非结构化的数据。
- 高扩展性:非关系型数据库具有良好的横向扩展性,可以方便地水平扩展,适应大规模数据的存储和处理需求。
- 高性能:非关系型数据库通常设计为面向键值对的存储方式,读写操作速度较快,适用于大量数据的快速存取。
- 分布式存储:非关系型数据库支持分布式存储和处理,能够在多个节点上存储和处理数据,提高系统的容错性和可用性。
- 适用于非结构化数据:适用于存储半结构化或非结构化的数据,如日志、文档、图片等。
范式
-
第一范式(1NF):确保每个属性都是原子的,即每个属性不能再分解为更小的数据项。换句话说,每个字段都只能包含一个值,而不能包含多个值或重复的组合。 不可分 例如,我们应该将客户的地址和电话分别存储在独立的字段中,而不是将它们合并在一个字段中。
-
第二范式(2NF):在满足第一范式的基础上,消除部分依赖。具体来说,所有非主属性都必须完全依赖于候选键,而不能只依赖于候选键的部分属性。
-
第三范式(3NF):在满足第二范式的基础上,消除传递依赖。这意味着非主属性不应该依赖于其他非主属性,而应该直接依赖于候选键。
此外,还有更高级别的范式,如Boyce-Codd范式(BCNF)和第四范式(4NF),它们进一步细化了数据结构的设计规范。
什么是 内连接、外连接、交叉连接(笛卡尔积)等?
在关系型数据库中,连接(Join)是将两个或多个表中的数据按照某些关联条件进行匹配、合并和筛选的操作。常见的连接类型包括内连接、外连接、交叉连接和自然连接。下面对它们进行简要解释:
-
内连接(Inner Join):内连接是最常用的连接类型之一。它返回两个表中满足连接条件的行,即同时存在于两个表中的行。内连接使用一个连接谓词(JOIN),并且只返回匹配条件为真的行。
-
外连接(Outer Join):外连接包括左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)等几种类型。外连接会返回满足连接条件的行,同时保留了未匹配的行。左外连接返回左表中的所有行,右外连接返回右表中的所有行,全外连接返回左右表中的所有行。
-
交叉连接(Cross Join):交叉连接是指返回两个表中所有可能的组合,也称为笛卡尔积(Cartesian Product)。交叉连接会将一个表中的每一行与另一个表中的每一行进行组合,生成的结果是两个表行数的乘积。
-
自然连接(Natural Join):自然连接是根据两个表之间的相同列名进行连接的操作,省略了连接条件(ON 条件)。自然连接将匹配列名相同的列作为连接条件,并返回匹配条件为真的行。
varchar和char的使用场景?
CHAR
是一种固定长度的字符数据类型,它会在存储数据时始终占用固定长度的存储空间。
VARCHAR
是一种可变长度的字符数据类型,它只会在存储实际数据时占用实际长度的存储空间。
char的存储方式是:**对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节。*varchar的存储方式是:**对每个英文字符占用2个字节,汉字也占用2个字节。
两者的存储数据都非unicode的字符数据
char的存取速度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找。
SQL语言分类
SQL语言共分为四大类:
- 数据查询语言DQL
- 数据操纵语言DML
- 数据定义语言DDL
- 数据控制语言DCL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:
SELECT FROM WHERE
数据操纵语言DML主要有三种形式:
- 插入:INSERT
- 更新:UPDATE
- 删除:DELETE
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
表 视图 索引 同义词 簇
DDL操作是隐性提交的!不能rollback
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚---ROLLBACK;回滚命令使数据库状态回到上次最后提交的状态。其格式为: SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。
提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP, EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后, 系统将自动进行提交,这就是自动提交。
其格式为:SQL>SET AUTOCOMMIT ON;
like"%"和_的区别
%百分号通配符:**表示任何字符出现任意次数(可以是0次).
_下划线通配符:**表示只能匹配单个字符,不能多也不能少,就是一个字符.
count(*)、count(1)、count(column)的区别
count(*)对行的数目进行计算,包含NULL
count(column)对特定的列的值具有的行数进行计算,不包含NULL值。
count()还有一种使用方式,count(1)这个用法和count(*)的结果是一样的。
-
COUNT(*)
:COUNT(*)
会统计查询结果集中的所有行数,不考虑行中的任何值是否为 NULL。- 这意味着它会对表中的所有行进行计数,包括包含 NULL 值的行。
- 通常情况下,
COUNT(*)
的性能比较好,因为它不需要对具体的列进行计算,只需统计行数。
-
COUNT(1)
:COUNT(1)
与COUNT(*)
类似,也会统计查询结果集中的所有行数。- 与
COUNT(*)
不同的是,COUNT(1)
不会检查行中的具体值,而是简单地计数存在的行数。 - 因为它不关心行中的任何值,所以在一些数据库中,
COUNT(1)
的性能可能略优于COUNT(*)
。
-
COUNT(column)
:COUNT(column)
统计指定列中非 NULL 值的行数。- 它会忽略列中的 NULL 值,并计算非 NULL 值的行数。
- 如果指定的列中没有 NULL 值,那么
COUNT(column)
的结果将等同于COUNT(*)
或COUNT(1)
。
总的来说,COUNT(*)
和 COUNT(1)
都会统计结果集中的所有行数,而 COUNT(column)
则统计指定列中非 NULL 值的行数。在性能方面,通常情况下 COUNT(*)
的性能是最好的。
什么是索引
数据库索引,是数据库管理系统中一个排序的数据结构,索引的实现通常使用B树及其变种B+树。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
索引作用:
协助快速查询、更新数据库表中数据。
创建索引可以大大提高系统的性能(优点):
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多不利的方面(缺点):
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
什么样的字段适合建索引
唯一、不为空、经常被查询的字段
MySQL B+Tree索引和Hash索引的区别?
Hash索引和B+树索引的特点:
Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位;
B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问;
为什么不都用Hash索引而使用B+树索引?
-
范围查询效率:B+ 树索引在范围查询(如
BETWEEN
、<
、>
)时效率更高。哈希索引不支持范围查询,因为哈希函数的特性导致无法直接找到一个范围内的连续键值。 -
排序:B+ 树索引可以很容易地支持排序操作,因为树的结构天然支持有序遍历。而哈希索引中的键值是无序的,无法直接支持排序操作。
-
稳定性:B+ 树索引对数据的插入和删除更稳定。哈希索引在动态数据集上可能会导致哈希冲突,需要频繁地进行重建。
-
覆盖索引:B+ 树索引支持覆盖索引,即索引本身包含了所有查询所需的数据字段。这样可以避免频繁地访问主键索引或数据表,提高查询性能。而哈希索引不支持覆盖索引。
-
多字段查询:B+ 树索引可以很容易地支持多字段组合查询,而哈希索引只能针对单个字段进行索引。
B树和B+树的区别
B树,每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为nul,叶子结点不包含任何关键字信息。
B+树,所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而B 树的非终节点也包含需要查找的有效信息)
为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引?
1.B+的磁盘读写代价更低
B+的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
2.B+tree的查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
聚集索引和非聚集索引的根本区别:
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致
什么是事务?
事务是对数据库中一系列操作进行统一的回滚或者提交的操作,主要用来保证数据的完整性和一致性。
事务四大特性(ACID)原子性、一致性、隔离性、持久性?
原子性(Atomicity):
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性(Consistency):
事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
隔离性(Isolation):
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
持久性(Durability):
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
事务的并发问题
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
3、幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。
例如:事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作 这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有跟没有修改一样,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
事务的隔离级别
读未提交:另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据脏读
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
可重复读:在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
串行化:最高的隔离级别,在这个隔离级别下,不会产生任何异常。并发的事务,就像事务是在一个个按照顺序执行一样
特别注意:
MySQL默认的事务隔离级别为repeatable-read
什么是嵌套事务?
嵌套是子事务套在父事务中执行,子事务是父事务的一部分,在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务,这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。重点就在于那个save point。看几个问题就明了了:
如果子事务回滚,会发生什么?
父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。
如果父事务回滚,会发生什么?
父事务回滚,子事务也会跟着回滚!为什么呢,因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。那么:
事务的提交,是什么情况?
是父事务先提交,然后子事务提交,还是子事务先提交,父事务再提交?答案是第二种情况,还是那句话,子事务是父事务的一部分,由父事务统一提交。
MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?
存储引擎 | 事务支持 | 锁定级别 | 索引类型 | 表空间 | 崩溃恢复 |
---|---|---|---|---|---|
InnoDB | 支持 | 行级锁定 | 聚集索引 | 支持 | 支持 |
MyISAM | 不支持 | 表级锁定 | 非聚集索引 | 不支持 | 不支持 |
MEMORY | 不支持 | 表级锁定 | HASH/BTREE索引 | 不支持 | 不支持 |
查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序?
查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--where--group by--having--order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
- **from:**需要从哪个数据表检索数据
- **where:**过滤表中数据的条件
- **group by:**如何将上面过滤出的数据分组
- **having:**对上面已经分组的数据进行过滤的条件
- **select:**查看结果集中的哪个列,或列的计算结果
- **order by :**按照什么样的顺序来查看返回的数据
from后面的表关联,是自右向左解析 而where条件的解析顺序是自下而上的
mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?
MySQL有三种锁的级别:页级、表级、行级。
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
- 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
什么情况下会造成死锁?
什么是死锁?
死锁: 是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程。
表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。