目录
视图
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
意义
- 简单:方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;
- 安全:数据库授权命令不能限定到特定行和特定列,视图可以把权限限定到行列级别;
个人建议:使用视图建议不要考虑修改视图的操作,视图的优势在于查询。- # 创建视图,视图名字不能和表名一致
- create view 视图名(列名1, 列名2, ...) as (查询表达式)
- # 视图要修改细节的话删除了重新创建就好了
- drop view if exists 视图名
复制代码 触发器
它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
原理: 触发器所依附的表称为基本表,当触发器表上发生select/update/delete等操作时,会自动生成两个临时的表(new表和old表,只能由触发器使用)。发生insert操作时,新的内容会被插入到new表中;发生delete操作时,旧的内容会被移到old表中;在update操作时,旧的内容会被移到old表中,新的内容会出现在new表中。
- # 创建触发器
- CREATE TRIGGER 触发器名称 [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON 表名/视图名 FOR EACH ROW DELETE FROM student WHERE student.sno = new.sno
- # 查看触发器
- SHOW TRIGGERS
- # 删除触发器
- DROP TRIGGER 触发器名称
复制代码 存储过程
存储过程:(PROCEDURE)是事先经过编译并存储在数据库中的一段SQL语句的集合。
- DELIMITER $$
- CREATE
- PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,inout 参数3, ...])
-
- BEGIN
- [DECLARE 变量名 类型 [DEFAULT 值];]
- 存储过程的语句块;
- END$$
- DELIMITER ;
复制代码 游标
游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作;
DECLARE 游标名 CURSOR FOR (查询语句);
异常处理句柄
DECLARE (continue/exit) HANDLE FOR 异常名称(ID) 语句
实例:- DELIMITER $$
- CREATE
- PROCEDURE de()
- -- 存储过程体
- BEGIN
- -- DECLARE声明 用来声明变量的
- DECLARE assignee_id INT;
- DECLARE founder_id INT;
- DECLARE x INT;
- DECLARE cur CURSOR FOR SELECT assignee_id, founder_id FROM task_assign;
- DECLARE CONTINUE HANDLER FOR 1329 SET x = 500;
- OPEN cur;
- WHILE TRUE DO
- FETCH cur into assignee_id, founder_id;
- SELECT assignee_id, founder_id;
- END WHILE;
- CLOSE cur;
- SELECT x;
- END$$
- DELIMITER ;
复制代码 调用存储过程- CALL demo8([in参数],@[out参数]);
复制代码 所有参数默认设置为IN
搜索存储过程- # 显示所有的存储过程
- SHOW PROCEDURE STATUS;
- # 显示特定数据库的存储过程
- SHOW PROCEDURE STATUS WHERE db = 数据库名字 AND NAME = 存储过程的名字;
- # 模糊搜索存储过程
- SHOW PROCEDURE STATUS WHERE NAME LIKE '%mo%';
复制代码 获取存储过程的源码- SHOW CREATE PROCEDURE 存储过程名;
复制代码 删除存储过程索引
单列索引
索引类型
- NORMAL:普通的索引类型,相当于目录。
- UNIQUE:唯一索引,一旦建立唯一索引,那么整个列中将不允许出现重复数据。
- 每个表的主键列,有且仅有一个主键索引,是特殊的唯一索引。
- 每张表可以有多个唯一索引,但只能有一个主键索引。
- SPATIAL:空间索引,空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON,不常用。
- FULLTEXT:全文索引(MySQL 5.6 之后InnoDB才支持),它作为模糊匹配的一种优秀的解决方案,使用的效率要比使用like %更高,并且支持多种匹配方式。只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
全文索引的使用- CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (body));
复制代码- INSERT INTO articles VALUES
- (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
- (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'),
- (NULL,'Optimising MySQL','In this tutorial we will show ...'),
- (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'),
- (NULL,'MySQL Security', 'When configured properly, MySQL ...');
复制代码 使用全文索引进行模糊匹配:- SELECT * FROM articles WHERE MATCH (body) AGAINST ('database');
复制代码 它的效率远高于以下这种写法:- SELECT * FROM articles WHERE body like '%database%';
复制代码 组合索引
将多个字段索引组合为一个索引
索引底层原理
通过数据结构(表内部的规律),降低数据库的IO成本,提高数据的检索效率;但是相应是索引会占据额外的磁盘空间,而为了维持表内部的规律,也会降低更新表的效率。
哈希表
散列表(哈希表):key的值通过哈希函数直接映射为value所在的地址。

优点:
缺点:
- Hash索引仅仅能满足“=”,“in”查询条件,不能使用范围查询。
- Hash碰撞问题(计算出的哈希值一致)
- 不能用部分索引键来搜索,因为组合索引必须要有全部的索引才能计算出对应的哈希值
平衡二叉树
平衡二叉树查找的效率是log2N,查询节点1需要IO读取(4,2)节点。

BTree
由于InnoDB存储引擎一次可以读取一页的数据量(默认16K),而降低二叉树的高度又可以减少查询次数,这样就可以将平衡二叉树改为平衡多叉树,进而减少磁盘的IO次数。
<ul>树中每个结点最多含有m个孩子(m >= 2)
除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子。(向上取整)
若根结点不是叶子结点,则至少有2个孩子。
所有叶子结点都出现在同一层。
每个非终端结点中包含有n个键值信息: (P1,K1,P2,K2,P3,......,Kn,Pn+1)。其中:
<ol>Ki (i=1...n)为键值,且键值按顺序升序排序K(i-1)< Ki。
Pi为指向子树根的结点,且指针P(i)指向的子树中所有结点的键值均小于Ki,但都大于K(i-1)。
键值的个数n必须满足: [ceil(m / 2)-1] |