简单的mysql功能,一句话概括“底层与工具介绍”

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、使用

                              1、声明游标:DECLARE 游标名称 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、代码演示

                        1、创建函数:CREATE 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、使用

                          1、创建触发器:CREATE 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 = old.id;  -- 更新操作 之后 修改表数据
END$$

DELIMITER ;

猜你喜欢

转载自blog.csdn.net/qq_38384460/article/details/113863530