mysql进阶笔记

一、索引

索引是帮助mysql高效获取数据的数据结构

1.优势和劣势

优势:

提高检索效率

降低数据排序成本

劣势:

占用空间

降低更新表效率(增删改),因为索引也要进行更新。

2.索引结构

BTREE 索引 innodb存储引擎主要用这个

HASH 索引

R-TREE 索引

FULL-TEXT 全文索引

MYSQL主流索引结构

平常说的索引,通常指B+树(多路搜索树)结构组织的索引。其中 聚集索引、符合索引、前缀索引、唯一索引默认使用B+tree索引,统称索引。

1.BTREE结构

多路平衡搜索树。

特性:一个m叉Btree

1.每个节点最多m个孩子

2.除了根叶节点,每节点最少[cell(m/2)] (向上取整)个孩子。

3.若根节点不是叶节点,最少有2个孩子

4.所有叶子节点在同一层

5.每个非叶节点有n个key和n+1个指针组成,其中[cell(m/2)-1]<= n <=m-1

2.B+TREE结构

指标和数据数量相同

1.最多n个key而btree是n-1个

2.叶子节点保存了所有key的信息,按照key大小排序

3.所有非叶子节点,都可看作key的索引部分。

B+TREE只有叶子节点保存key信息,查询任何key都要从root走到叶子,所以更稳定。

3.mysql中的B+TREE

mysql对B+TREE进行了优化

在原B+TREE上加了一个指向相邻叶子节点的联表指针(双向链表),形成了个带顺序指针的B+TREE,提高区间访问性能。

便于范围搜索

3.索引分类

单值(列)索引 : 一个索引只包含一列,一表可有多个单值索引

唯一索引 :一列的值必须唯一,为此列建的索引。运行null值 可出现多次。

复合索引:包含多列的索引

4.语法

1.创建索引

mysql会为主键自动创建索引

create 索引分类(unique,fulltext,spatial) index 索引名称 索引结构(不指定默认B+TREE) on table_name(字段名,…)

例:

create index idx_city_name on city(city_name);

2.查看索引

show index fron 表名

show index from city

转置表格查看:

show index from city\G

3.删除索引

drop index 索引名 on 表名

drop index idx_city_name on city

4.alter

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);

5.索引设计原则

什么样的表建立索引?

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,就会走索引。

二、视图

视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。

视图创建之后可以充当一个表进行查询

表中数据发生改变,视图中的数据也会改变

1.创建视图

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 指定视图为临时表

只读视图只能查看,不能修改数据

2.视图作用

  1. 简单性

    看到的就是需要的。不仅可以简化用户对数据的理解,也可以简化用户的操作。

  2. 安全性 可以防止未授权用户查看特定的列

    例如:薪资列在公司中属于敏感字段,普通员工不能查看。财务部门访问视图可以查看薪资。普通员工未授权的情况下访问不了财务部门的视图。如果有新的财务部门的员工入职,可以给当前员工授权访问视图。

  3. 主从同步

    资源表数据发生改变,视图自动更新数据

三、存储过程

把SQL语句放在数据库中创建,然后直接编译,程序就可以直接重复调用

1. 存储过程的优点

  1. 存储过程在创建的时候直接编译,SQL语句每次使用都要编译,可以提高执行效率

  2. 存储过程是可以被重复使用(SQL语句也可以重复使用,重复编写)

  3. 一条SQL语句,可能需要访问几张表,数据库连接有可能连接多次,存储过程只需要连接一次数据库即可

  4. 存储过程,程序安全性。访问表----存储过程(权限的)

2. 存储过程缺点

  1. 存储过程可移植性太差

  2. 对于简单的SQL语句,毫无意义的

  3. 对于只有一类用户的系统,安全性毫无意义

  4. 团队开发(一定要制定好标准,严格执行),后期维护很麻烦

  5. 对于开发和调试都很不方便

  6. 复杂的业务逻辑,运行很吃力

一般情况下,不建议使用,比较麻烦,除非是有特定的需求。

3.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$$

你可能感兴趣的:(数据库,数据库开发,java)