mysql高级,mysql体系结构,mysql引擎,存储过程,索引,锁
1.mysql体系结构
1) 连接层
主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2) 服务层
第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如 过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询的顺序,是否利用索引等, 最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
3) 引擎层 [存储引擎]
数据存储层, 主要是将数据存储在文件系统之上,并完成与存储引擎的交互。
存储引擎层, 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。 在之前[MyISAM]: MySQL5.5之后,MySQL默认的存储引擎就是InnoDB,InnoDB默认使用的索引结构就是B+树,上面的服务层就是通过API接口与存储引擎层进行交互的
4)存储层
和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎上,插件式的存储引擎架构,将查询处理和其他的系统任务以及数据的存储提取分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
2.mysql引擎
MySQL5.5之前的默认存储引擎是MyISAM,5.5之后就改为了InnoDB。
InniDB支持事务,行级锁,外键
mylSAM 不支持事务和外键,支持表级锁
InnoDB存储引擎是Mysql的默认存储引擎。InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
3.存储过程
MySQL 中的存储过程是一种预编译的 SQL 脚本,它可以存储在数据库服务器上,并通过一个名称来调用。存储过程可以在数据库级别上封装一组复杂的操作,这样可以简化客户端应用程序与数据库之间的交互,并且可以提高性能和安全性。
1.创建存储过程
CREATE PROCEDURE te01()
BEGIN
SELECT 'hello';
END;
调用
call te01();
2.删除
DROP PROCEDURE te01;
3.定义变量
create PROCEDURE te02()
BEGIN
declare num int default 5;
SELECT num + 20;
END;
call te02();
4.直接赋值使用 SET
CREATE PROCEDURE te03()
BEGIN
DECLARE num int DEFAULT 1;
set num=10;
SELECT num;
END;
CALL te03();
5.通过select ... into 方式进行赋值操作
CREATE PROCEDURE te04()
BEGIN
DECLARE num VARCHAR(20);
SELECT city_name into num from city_innodb WHERE city_id=1;
SELECT num;
END;
call te04();
6.if条件判断
CREATE PROCEDURE ce03(in m int,out result VARCHAR(200))
BEGIN
if m in (1,3,5,7,8,10,12) then set result='31天';
ELSEIF m=2 then set result='28天';
ELSE set result='30天';
end if;
END;
call ce03(2,@r);
SELECT @r;
7.case
CREATE PROCEDURE te08(in n int)
BEGIN
CASE
WHEN n in (1,3,5,7) THEN
SELECT '奇数';
WHEN n in (2,4,6,7) THEN
SELECT 'o数';
ELSE
SELECT '输入错误';
END CASE;
END;
call te08(5);
8.while
CREATE PROCEDURE te09(in n int,out sum INT)
BEGIN
set sum=0;
WHILE n>=1 DO
set sum=sum+n;
set n=n-1;
END WHILE;
END;
call te09(100,@sum);
SELECT @sum;
9.repeat 类似do{}while
CREATE PROCEDURE te10(in n int,out sum int)
BEGIN
set sum=0;
REPEAT
set sum=sum+n;
set n=n-1;
UNTIL n=0 END REPEAT;
END;
CALL te10(100,@sum);
SELECT @sum;
4.索引
索引它就是一种数据结构,可以帮mysql快速查找到相应的数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的手段。
4.1索引优势劣势
4.2索引结构
不同的数据库引擎使用的索引结构不同,一般多用B+树
B+TREE 索引 : 最常见的索引类型,大部分引擎都支持 B 树索引。
HASH 索引:只有Memory引擎支持 , 使用场景简单 。
Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引。
4.3二叉树,红黑树,B+树
二叉树的缺点:顺序插入时,会形成一个链表,查询性能大大降低,在大量数据的情况下层级较深,检索速度慢
红黑树:大量数据的情况下,层级较深,检索速度慢
B树,采用多路平衡,每个节点既存放索引又存放数据
B+树,根节点只存放索引,所有数据都存放在中叶子节,并且叶子节点会形成一个双链表,方便范围内查找,且查找效率比较稳定
4.4索引分类
按索引字段的特性分类
普通索引
- 即一个索引值包含单个列。一个表可以有多个单例索引
唯一索引
- 与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引 它是一种特殊的唯一索引,不允许有空值
联合索引(多列索引,组合索引,复合索引)
- 一个索引包含多个列,专门用于组合搜索,其效率大于索引合并
全文索引
按索引的存储形式
聚集索引 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
必须有,而且只有一个
二级索引 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键
可以存在多个
索引的语法
create index 索引名[name_index] on 表名(name)
type索引类型
system :根据主键索引
const::根据唯一索引
eq_ref和ref:根据普通索引
range:索引范围查询
index和all:没有索引查询
平常的到达了range即可,尽量到ref
如何分析sql
explain 一般查看哪些指标:type索引类型key:实际使用的索引key_len索引的长度row:影响得到行数
索引失效的场景:
1.使用联合索引时必须满足最左前缀法则
从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。
2.使用联合索引时,某个字段进行了范围查询,它的右侧索引会失效(创建索引时的顺序)
3.索引运算,索引列上有运算操作的话会失效
4.字符串索引类型的字段查询时没有使用 ' '
5.模糊查询,尾部模糊索引不会失效,头部模糊会失效
6.or 连接了一个索引字段,or后面的字段没有索引则导致索引字段也会失效
7.覆盖索引
查找的条件和需要的数据都能在索引中找到,不需要再回表
5.锁
5.1锁的分类
从对数据操作的粒度分 :
1) 表锁:操作时,会锁定整个表。MyISAM 5.6 后InnoDB支持
2) 行锁:操作时,会锁定当前操作行。Innodb
从对数据操作的类型分:
1) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
2) 写锁(排它锁):当前操作没有完成之前,它会阻断其他写操作和读操作。
MySQL这2种锁的特性可大致归纳如下 :
锁类型 | 特点 |
---|---|
表级锁 | 偏向MyISAM 存储引擎,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 |
行级锁 | 偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 |
5.2mylsam表锁
MyISAM 存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型。
MyISAM 在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT 等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用 LOCK TABLE 命令给 MyISAM 表显式加锁。 但是我们为了演示出效果人为加锁。
显示加表锁语法:
加读锁 : lock table table_name read;
加写锁 : lock table table_name write;--- insert delete updpate
释放锁: unlock tables; -- 执行完毕
5.3InnoDB 行锁
行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是 采用了行级锁。
InnoDB 实现了以下两种类型的行锁。
-
共享锁(S):又称为读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
-
排他锁(X):又称为写锁,简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
当执行修改操作,默认innodb就会给数据库表中对应的行加排他锁
对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
对于普通SELECT语句,InnoDB不会加任何锁;
行级锁:
分成: 共享锁: 执行select时会自动添加该锁。 不影响其他的操作。
排他锁: 执行更新操作时自动添加该锁。影响其他事务的更新操作
5.3.2悲观锁和乐观锁
悲观锁:
乐观锁: 增加一个version字段,---一个事务进行操作时,该事务会先获取version的值。当这个事务操作完成后,查看数据库中的version字段值是否和当前自己家拥有的version字段的值相同。如果相同则修改成功并对version+1,如果不同则不修改。