Mysql
1、什么是索引
索引是帮助mysql快速获取数据的数据结构,我们常用的索引结构是B+TREE
2、索引的优势
提高数据检索的速度,如果没有索引查询最后一个数据就需要全表查询,有了索引之后,直接从索引的数据结构中搜索到(例如树结构),然后对应到数据中即可,减少了查询次数
3、索引的劣势
增删改不止需要维护表,并且需要维护索引,增删改的效率降低
索引也需要占用空间
4、索引结构
BTREE:大部分引擎都支持,最常见的索引
HASH:只有memory引擎支持
RTREE(空间索引):是MyISAM的特殊索引类型,使用较少
FULL_TEXT(全文索引):是MyISAM的特殊索引,用于全文索引
5、BTREE结构
1、BTREE特性
树中的每个节点最多包含m个孩子
除了根节点和叶子节点之外,每个节点至少有m/2(向上取整)个孩子
如果根节点不是叶子节点,至少会有两个孩子
所有的叶子节点都在同一层
每个非叶子节点都有n个key和n+1个指针(指向子节点)组成,key的取值范围为:m/2(向上取整)-1 <= n <= m-1,如果m是5,结果就是2 <= n <= 4,当超出该范围时,中间节点向上,两边节点分裂
2、5叉BTREE举例
3、结论
btree和二叉树相比,相同的数据量,btree的层级更少,也就能更快的获得到数据,效率也就更高
6、B+TREE
1、与btree的区别
1、n叉b+树最多有n个key,而btree最多有n-1个key
2、b+tree的子节点保存所有的key,按key的大小顺序排列
3、所有的非叶子节点都可以看做是key的索引
4、没有子节点的才可以称之为叶子节点,其他的都是索引,索引中的数据也会在叶子节点中存储
5、由于b+tree只有叶子节点保存key信息,所以查询所有的key都要从root开始查找,所以b+tree查询效率更加稳定
2、mysql中的b+tree
mysql对b+tree进行了优化,增加了一个相领叶子节点的指针,这样也就提高了范围搜索访问的查询速度
7、索引分类
1、单值索引
一个索引中只有一个列,一个表中可以有多个单值索引
ALTER TABLE table_name ADD INDEX `index_name` (`column`);
2、唯一索引(UNIQUE)
加唯一索引的列值不能相同,可以为空
ALTER TABLE table_name ADD UNIQUE INDEX `index_name` (`column`);
3、复合索引
一个索引中可以加多个列
ALTER TABLE table_name ADD INDEX `index_name` (`column`,`column2`,`column3`);
8、索引设计原则
1、查询频次高,数据量大的数据可以加索引
2、尽量使用唯一索引,区分度越高,速度越快
3、索引不是越多越好,因为增删改的效率会慢
4、利用最左前缀法则,这样能充分使用索引。例如加了 name,phone,age三个联合索引,where条件后同时存在则都走索引,如果只存在name和age,只会走name的索引,where条件后顺序没有要求
9、视图
1、介绍
1、视图是一个虚拟存在的表,视图并不在数据库中实际存在。视图其实就是一条select的结果集
2、简单,使用视图相当于就是直接操作已经查询出的结果集
3、安全,有些表的完整数据不希望开发人员看到,可以使用视图封装可以让开发人员看到的字段
4、数据独立,原表字段修改列明直接就修改视图即可
5、视图也可以更新,不建议更新
2、视图操作
1、创建视图
CREATE VIEW view_name AS sql;
2、使用视图
SELECT * FROM view_name;
10、存储过程
1、介绍
存储过程是事先编译并存储在数据库的一段sql语句
函数:有返回值的过程
过程:没有返回值的过程
2、创建语句
需要注意:由于分号是分隔符,但最后需要一个end,end前有分号就进行不到分号这里了,所以需要先将分隔符改为其他的,例如$$,创建完分隔符再改回来即可
DELIMITER $$ -- 将分号分隔符改为$$
CREATE PROCEDURE pro_test1()
BEGIN
SELECT '你好啊'; -- 这里的分号已经没用了
END$$ -- 这里使用$$来结尾
DELIMITER ;将分隔符改回到分号
3、使用存储过程
CALL pro_test1();
4、语法
1、声明变量:begin后面增加:DECLARE 变量名 INT DEFAULT 默认值;
2、变量赋值:set 变量名 = 改后内容;
3、查询出的内容赋值给变量:SELECT COUNT(1) INTO 变量名 FROM 表名;
4、条件判断:if 条件 then set 变量; elseif 条件 then set变量;else set 变量;end if;
IF num < 0 THEN
SET result = -1;
ELSEIF num = 0 THEN
SET result = 0;
ELSE
SET result = 100;
END IF;
5、参数传入 :默认为in
1、in: 传入参数,格式:in 变量名 变量类型
2、out:返回参数:格式:out 变量名 变量类型。调用时第二个参数传入@会话变量,直接select @会话变量即可查询到结果
3、inout:是in也是out
DROP PROCEDURE pro_test5;
DELIMITER $$
CREATE PROCEDURE pro_test8(OUT result INT)
BEGIN
SET result = 1; -- 返回值改为1
END$$
DELIMITER ;
CALL pro_test8(@result); -- @会话变量
SELECT @result; -- 输出会话变量
6、while循环:while 条件 do 执行语句 end while; 不满足条件就执行
7、repeat循环:REPEAT 执行语句 until 条件 end REPEAT; 满足条件就执行
8、loop循环:c:loop 执行语句 if 结束条件 then leave c; end if; end loop;
11、游标
1、介绍
储存查询的结果集,
2、使用
CURSOR FOR 查询sql;
2、打开游标:OPEN 游标名称;
3、开始游标:FETCH 游标名称 INTO 定义的常量;
4、关闭游标:close 游标名称;
5、游标结束判断(需要和声明游标放一块):DECLARE EXIT HANDLER FOR NOT FOUND SET has_data = 0;
DELIMITER $$
CREATE PROCEDURE pro_test18()
BEGIN
DECLARE e_id BIGINT(20) ;
DECLARE has_data INT(1) DEFAULT 1;
DECLARE excel_result CURSOR FOR SELECT id FROM loandetail; -- 声明游标
DECLARE EXIT HANDLER FOR NOT FOUND SET has_data = 0; -- 游标结束判断
OPEN excel_result; -- 打开游标
WHILE has_data=1 DO -- 循环游标
FETCH excel_result INTO e_id; -- 将数据复制给常量
SELECT e_id; -- 查询常量
END WHILE; -- 退出循环
CLOSE excel_result; -- 退出游标
END$$
DELIMITER ;
12、函数
1、介绍
有返回值,和存储过程相似
2、代码演示
FUNCTION 函数名称(传参 参数类型)
2、定义返回类型:returns 返回类型
3、begin return 返回值 end;
DELIMITER $$
CREATE FUNCTION pro_test20(num INT) -- 定义函数
RETURNS INT -- 返回值类型
BEGIN
DECLARE cnum INT(10);
SET cnum = num + 1;
RETURN cnum; -- 返回结果
END$$
DELIMITER ;
13、触发器
1、介绍
可以在数据表增删改之前或者之后触发一次事件,可以用于记录日志、校验数据等。利用new 和 old 来表示数据
2、使用
TRIGGER 触发器名称
2、可以是before/after
3、可以是update/delete/insert
4、要操作的表:on 表
5、行级操作:FOR EACH ROW
6、执行操作:begin 中间不可以是select,可以是update/select/insert end;
DELIMITER $$
CREATE TRIGGER pro_test24 -- 创建触发器
AFTER UPDATE -- 更新操作 之后 执行
ON excel -- excel 表更新操作 之后 执行
FOR EACH ROW -- 行级更新
BEGIN
UPDATE `salestype` SET title = new.id,yaAnPm = ; -- 更新操作 之后 修改表数据
END$$
DELIMITER ;