一、聚簇索引与非聚簇索引
1、聚簇索引:
①索引顺序就是数据的物理存储顺序。
②索引二叉树叶节点存放的是数据。
③聚簇索引对于范围搜索有较高的性能,原因就在于数据的物理存储顺序就是索引的顺序,那么只要找到了第一个索引,其后的数据就存在相邻的节点中。例如日期范围搜索。
④一张表只能有一个聚簇索引。原因很简单,聚簇索引的顺序就是数据物理存储的顺序,如果一张表存在多个聚簇索引,那么数据的物理存储到底该选择哪一种顺序呢?显然是不可能的。
2、非聚簇索引:
①索引顺序与数据的物理存储顺序无关。
②索引二叉树叶节点存放的还是索引节点,虽然这个索引节点包含指向数据块的指针,但取数据还是要多走一步。
③非聚簇索引中数据与索引是分开存储的,数据存在一个文件中,索引存在另一个文件中,索引保存了指向数据块的指针。
二、游标
①游标的作用:定位结果集的行。
②如何知道游标已经到了最后:通过判断全局变量@@FETCH_STATUS,可以判断游标是否到了最后,通常此变量不等于0表示出错或到了最后。
三、触发器
1、事前触发器
①事前触发器:运行于触发事件发生之前。
②事前触发器可以获取事件之前和新的字段值。
2、事后触发器
①事后触发器:运行于触发事件发生之后。
3、语句级触发器
①语句级触发器可以在语句执行前或执行后执行。
4、行级触发器
①行级触发器在所影响的每一行触发一次。
四、UNION 与 UNION ALL
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表连接后会去掉重复的记录,UNION All不会去除重复记录。
2、对排序的处理:UNION将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
因此,从效率上说,UNION ALL 要比UNION快很多。所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序的话,那么就使用UNION ALL,效率高很多。
五、视图
因为视图本身没有数据,因此对视图进行的DML操作(update/delete/……)最终都体现在基表中。当然,不是所有的视图都可以做DML操作。有下列内容之一,视图不能做DML操作:
①select子句中包含distinct
②select子句中包含组函数
③select语句中包含group by子句
④select语句中包含order by子句
⑤select语句中包含union 、union all等集合运算符
⑥where子句中包含相关子查询
⑦from子句中包含多个表
⑧如果视图中有计算列,则不能更新
⑨如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作。
对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束,它的作用是:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。利用with check option约束限制,保证更新视图是在该视图的权限范围之内。
删除视图时,只能删除视图的定义,不会删除数据,也就是说不会删除基表。
六、MySQL8.0版本的CTE(Common Table Expression)
其实本质上就是更高效的视图,只不过视图查询出来的数据会保留在内存中,而CTE查出来的数据可以一直使用,因为被物理化存储下来了。
语法:with cte_name1 as(select XX from XX ……),cte_name2 as (select XX from XX ……),cte_name3 as (select XX from XX ……)