索引是帮助mysql高效获取数据的数据结构。
优势:
提高检索效率
降低数据排序成本
劣势:
占用空间
降低更新表效率(增删改),因为索引也要进行更新。
BTREE 索引 innodb存储引擎主要用这个
HASH 索引
R-TREE 索引
FULL-TEXT 全文索引
MYSQL主流索引结构
平常说的索引,通常指B+树(多路搜索树)结构组织的索引。其中 聚集索引、符合索引、前缀索引、唯一索引默认使用B+tree索引,统称索引。
多路平衡搜索树。
特性:一个m叉Btree
1.每个节点最多m个孩子
2.除了根叶节点,每节点最少[cell(m/2)] (向上取整)个孩子。
3.若根节点不是叶节点,最少有2个孩子
4.所有叶子节点在同一层
5.每个非叶节点有n个key和n+1个指针组成,其中[cell(m/2)-1]<= n <=m-1
指标和数据数量相同
1.最多n个key而btree是n-1个
2.叶子节点保存了所有key的信息,按照key大小排序
3.所有非叶子节点,都可看作key的索引部分。
B+TREE只有叶子节点保存key信息,查询任何key都要从root走到叶子,所以更稳定。
mysql对B+TREE进行了优化
在原B+TREE上加了一个指向相邻叶子节点的联表指针(双向链表),形成了个带顺序指针的B+TREE,提高区间访问性能。
便于范围搜索
单值(列)索引 : 一个索引只包含一列,一表可有多个单值索引
唯一索引 :一列的值必须唯一,为此列建的索引。运行null值 可出现多次。
复合索引:包含多列的索引
mysql会为主键自动创建索引
create 索引分类(unique,fulltext,spatial) index 索引名称 索引结构(不指定默认B+TREE) on table_name(字段名,…)
例:
create index idx_city_name on city(city_name);
show index fron 表名
show index from city
转置表格查看:
show index from city\G
drop index 索引名 on 表名
drop index idx_city_name on city
alter table city add primary key(column_list);
添加一个主键,要求索引值唯一,且不为null
alter table city add unique index_name(city_name)
创建唯一索引,alter table 表名 add unique 索引名(字段名)
alter table city add index index_name(city_name);
alter table city add fulltext index_name(city_name);
什么样的表建立索引?
1)查询频次高,数据量较大
2)索引字段选择,常拼接于where后面的查询条件字段
3)尽量用唯一索引,区分度越高,使用索引效率越高
4)索引不是越多越好,不利于增删改
5)使用短索引(给短字段添加索引,如int(1))
6)对于复合索引,利用最左前缀(最左索引)。
组合索引(复合)创建:
create index city(city_name,city_code,status);
相当于
对city_name
对city_name,city_code
对city_name,city_code,status
创建了索引。
查询的时候,使用city_name,就会走索引。
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。
视图创建之后可以充当一个表进行查询
表中数据发生改变,视图中的数据也会改变
CREATE VIEW view_name AS (SELECT * FROM ...);
CREATE OR REPLACE VIEW view2 AS SELECT * FROM person;#创建视图
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW view3 AS SELECT * FROM person;#创建只读视图
CREATE OR REPLACE VIEW view3 AS SELECT NAME AS 账号,PASSWORD AS 密码 FROM person;#创建显示表中部分字段信息的视图
ALGORITHM=TEMPTABLE 指定视图为临时表
只读视图只能查看,不能修改数据
简单性
看到的就是需要的。不仅可以简化用户对数据的理解,也可以简化用户的操作。
安全性 可以防止未授权用户查看特定的列
例如:薪资列在公司中属于敏感字段,普通员工不能查看。财务部门访问视图可以查看薪资。普通员工未授权的情况下访问不了财务部门的视图。如果有新的财务部门的员工入职,可以给当前员工授权访问视图。
主从同步
资源表数据发生改变,视图自动更新数据
把SQL语句放在数据库中创建,然后直接编译,程序就可以直接重复调用
存储过程在创建的时候直接编译,SQL语句每次使用都要编译,可以提高执行效率
存储过程是可以被重复使用(SQL语句也可以重复使用,重复编写)
一条SQL语句,可能需要访问几张表,数据库连接有可能连接多次,存储过程只需要连接一次数据库即可
存储过程,程序安全性。访问表----存储过程(权限的)
存储过程可移植性太差
对于简单的SQL语句,毫无意义的
对于只有一类用户的系统,安全性毫无意义
团队开发(一定要制定好标准,严格执行),后期维护很麻烦
对于开发和调试都很不方便
复杂的业务逻辑,运行很吃力
一般情况下,不建议使用,比较麻烦,除非是有特定的需求。
DELIMITER重新定义mysql的sql语句分隔符
DELIMITER $$ 中间只有一个空格
—@:地址/引用
#语法结构
DELIMITER $$
CREATE
PROCEDURE 名称()
BEGIN
#sql语句
END$$
#简单的存储过程
DELIMITER //
CREATE PROCEDURE demo1()
BEGIN
SELECT COUNT(*) FROM person;
END//
#调用存储过程
CALL demo1();
#带参数和返回值的存储过程
DELIMITER //
CREATE PROCEDURE demo2(IN p INT,IN q INT,OUT s INT)
BEGIN
SET s = p+q;
END//
CALL demo2(1,3,@s);
SELECT @s;
触发器(trigger):监听某种情况,触发相关操作
触发器业务场景:日志、备份、数据安全性校验…
#语法结构:
DELIMITER $$
CREATE TRIGGER:(触发器的关键字)
BEFORE/AFTER :(触发器执行的时机)
INSERT/UPDATE/DELETE:(触发触发器的操作类型)
ON 表名 : (作用于哪张表)
FOR EACH ROW:(MySQL固定写法)
BEGIN
END$$