




MYISAM被MangoDB替代了
MEMORY被Redis替代了
是一种高效获取数据的数据结构


插入超过5个数,会从中间分裂

所有的元素都会出现在叶子节点,形成单向链表
非叶子节点只是起到索引数据的作用








回表查询:先走二级索引拿到主键id值,然后再拿这一行的数据


在B+树中,主键通常存储在叶子节点中,而非叶子节点只存储索引信息。这是B+树的一个特性
取决主键的数据类型吧,指针取决系统是多少位吧
map和set的底层数据结构
是一种自平衡的二叉搜索树,它在插入和删除节点时通过一系列规则来保持树的平衡,从而保证了较好的搜索、插入和删除性能。
红黑树具有以下特性:
B+树的有序性使得顺序遍历更加高效
B+树结构通常更符合关系数据库的索引结构
红黑树在某些场景中也有其优势,比如更平衡的性能特征,适用于动态插入和删除的场景
inner join:返回两个表中具有相同键值的行
left join:返回左表的所有行,以及右表中的匹配行,没有匹配行,右表的列包含NULL值
right jojn:返回右表的所有行,以及左表中的匹配行,没有匹配行,左表的列包含NULL值
一组SQL语句的执行单元,它要么完全执行,要么完全不执行
BEGIN TRANSACTION; -- 开始事务
-- 在这里执行一系列SQL语句,可能包括INSERT、UPDATE、DELETE等操作
IF (/* 检查是否满足提交条件 */) BEGIN
COMMIT; -- 提交事务
END ELSE BEGIN
ROLLBACK; -- 回滚事务
END;
数据库触发器(Database Trigger)是一种特殊的存储过程,它在数据库管理系统中自动执行或触发的一系列操作。触发器通常与特定的数据库表相关联,它们在表上的某些事件(例如插入、更新、删除)发生时被自动触发执行。数据库触发器(Database Trigger)是一种特殊的存储过程,它在数据库管理系统中自动执行或触发的一系列操作。触发器通常与特定的数据库表相关联,它们在表上的某些事件(例如插入、更新、删除)发生时被自动触发执行。
数据库触发器的主要目的是在特定的数据库操作发生时,自动执行一些额外的操作或逻辑,以确保数据的完整性、一致性或应用特定的业务规则。触发器通常用于以下几个方面:
数据库触发器通常有两种类型:
下面是一个简单的示例,演示了一个触发器的使用。假设有一个名为 Orders 的表,我们想在插入新订单时,自动更新与该订单相关的客户的最后订单日期:
CREATE TRIGGER UpdateLastOrderDate
ON Orders
AFTER INSERT
AS
BEGIN
UPDATE Customers
SET LastOrderDate = GETDATE()
WHERE Customers.CustomerID IN (SELECT CustomerID FROM INSERTED);
END;
在这个例子中,当在 Orders 表中插入新数据时,触发器 UpdateLastOrderDate 会在插入后自动执行,并更新与插入订单相关的客户的最后订单日期。这是一个简单的示例,实际上触发器可以包含更复杂的逻辑。
数据库触发器(Database Trigger)是一种特殊的存储过程,它在数据库管理系统中自动执行或触发的一系列操作。触发器通常与特定的数据库表相关联,它们在表上的某些事件(例如插入、更新、删除)发生时被自动触发执行。
Innodb 存储引擎的索引是 B+ 树结构


这条语句使用了主键索引查询 id 号为 5 的商品。查询过程是这样的,B+Tree 会自顶向下逐层进行查找:
正是因为 B+ 树的索引是有序存放的,所以我们可以通过类似于二分查找算法快速找到对应的数据。
答:B+树它是一种树形结构,在这棵树里它是能支持多个节点的(多叉树)。也就是相比于平衡二叉树来说,它一层能够存储的节点数量是更多的。B+树它比较特殊的地方是在于,除了叶子节点以外,它存的基本上都是路径信息, index 信息。只有在最后一层页节点才会存储具体的数据信息。
答:
在数据库中,事务(Transaction)是一组操作单元,这些操作单元要么全部执行成功,要么全部执行失败。事务是保证数据库一致性的重要机制之一,它可以将一系列的操作看作一个整体,从而保证数据库的完整性和正确性。
事务具有四个特性,即ACID:
MySQL是一种常见的关系型数据库,支持事务的机制。在MySQL中,事务可以
通过使用事务控制语句(Transaction Control Statements)来进行管理,包括以下三个语句:
在MySQL中,事务默认是关闭的,需要通过设置autocommit参数为0来启用事务。启用事务后,可以通过执行SQL语句来进行事务操作
有多个操作,并且想要这个操作是原子性,要不这多个操作一起成功,要不就一起失败。这样的场景会需要事务。

我们在转账操作前先开启事务,等所有数据库操作执行完成后,才提交事务,对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,如果中途发生中断或错误,那么该事务期间对数据库所做的修改将会被回滚到没执行该事务之前的状态。

要看数据库的隔离级别,如果它的隔离级别比较高,这个事务没有完成之前,他对数据的修改,另一个事务是没有办法感知到的。但是如果他事务的隔离级别比较低,是可以能够查到的。
读者答:大概有 4 种隔离级别读未提交,读已提交,可重复读和串行化情况。
补充:
SQL 标准提出了四种隔离级别来规避这些现象,隔离级别越高,性能效率就越低,这四个隔离级别如下:

含义:虚拟表,和普通表一样使用
行和列的数据来自自定义视图查询中使用的表,通过表动态生成的数据
只保存sql逻辑,不保存查询结果
场景:
1)多个地方用到同样的查询结果
2)该查询结果使用的sql语句较复杂
视图和表的对比:
创建语法的关键字 是否实际占用物理空间 使用
视图 create view 只是保存了sql逻辑 增删改查,一般不能增删改
表 create table 保存了数据 增删改查
:::info
含义:一组预先编译好的sql语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
:::
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
注意:
1、参数列表包含三部分
参数模式 参数名 参数类型
举例:IN stuname VARCHAR(20)
IN:该参数可以作为输入,也就是该参数需要调用方传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数即可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2、如果存储过程体仅仅只有一句话,BEGIN END 可以省略
存储过程体中的每条SQL语句的结尾要求必须加分号
存储过程的结尾可以使用delimiter重新设置
语法:
DELIMITER 结束标记
案例:DELIMITER $
CALL 存储过程名(实参列表);
区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入,批量更新
函数:有且仅有1个返回,适合做处理数据后返回一个结果
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN()
函数体
END
注意:
1.参数列表 包含两部分
参数名 参数类型
2.函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议return 值;
3.函数体中仅有一句话,则可以省略begin end
4.使用delimiter语句设置结束标记
SELECT 函数名(参数列表)
1)计算机协调多个进程或线程并发访问某一资源的机制。
2)在数据库中,除传统计算资源(CPU、RAM、I/O等)的争抢,数据也是一种供多用户共享的资源。
如何保证数据并发访问的一致性,有效性,是所有数据库必须要解决的问题。
锁冲突也是影响数据库并发访问性能的一个重要因素,因此锁对数据库尤其重要。
3)锁的缺点
加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否已解除、释放锁等 ,都会增加系统的开销。
4)例子
淘宝双十一活动,当天的人流量是千万及亿级别的,但商家的库存是有限的。
系统为了保证商家的商品库存不发生超卖现象,会对商品的库存进行锁控制。当有用户正在下单某款商品最后一件时,系统会立马对该件商品进行锁定,防止其他用户也重复下单,直到支付动作完成才会释放(支付成功则立即减库存售罄,支付失败则立即释放)
存储引擎默认锁** MyISAM**
存储引擎默认锁:InnoDB
开销、加锁时间和锁粒度介于表锁和行锁之间,会出现死锁,并发处理能力一般
1)数据丢失,redis是内存数据库,存在服务器宕机或数据丢失的风险,可以使用持久化机制,如RDB快照和AOF日志,定期将数据写入磁盘
2)缓存数据一致性问题,后端数据更改,使缓存数据失效,以免返回过期数据
1)数据同步问题,等待复制确认或使用异步复制来提高性能
2)竞态条件问题,redis操作是原子性的,使用事务或者乐观锁