MySQL 索引
-
什么是索引?
-- 索引就是排好序的,帮助我们进行快速查找的数据结构.
-- 简单来讲,索引就是一种将数据库中的记录按照特殊形式存储的数据结构。通过索引,能够显著地提高数据查询的效率,从而提升服务器的性能.
-- 专业一点来说呢,索引是一个排好序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据库十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
-- MySQL 将一个表的索引都保存在同一个索引文件中,如果对其中的数据进行增删改操作,MySQL 都会自动的更新索引。
-
常见索引分类
Primary Key -- 主键索引
主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的每一条记录。
一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含 NULL。
-- 为 demo1 表添加主键索引
-- 创建 demo01 表
CREATE TABLE demo01(
did INT,
dname VARCHAR(20),
hobby VARCHAR(30)
);
ALTER TABLE demo01 ADD PRIMARY KEY (did);
-- 删除表
DROP TABLE demo01;
-- 创建表的时候直接添加主键索引 (最常用)
CREATE TABLE demo01(
did INT PRIMARY KEY,
dname VARCHAR(20),
hobby VARCHAR(30)
);
Unique -- 唯一索引
唯一索引指的是索引列的所有值都只能出现一次,必须唯一。
唯一索引可以保证数据记录的唯一性,而且索引的效率也提升了。事实上,创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
-- 使用 create 语句添加唯一索引
CREATE UNIQUE INDEX index_hobby ON demo01(hobby)
-- 创建表的时候直接添加主键索引
CREATE TABLE demo02(
did INT PRIMARY KEY,
dname VARCHAR(20),
hobby VARCHAR(30),
UNIQUE index_hobby (hobby)
);
-- 通过表结构删除索引
ALTER TABLE demo02
DROP INDEX index_hobby;
-- 通过表结构添加索引
-- 索引名字可省略,会自动生成名字
ALTER TABLE demo02
ADD UNIQUE (hobby);
-- 向表中插入数据
INSERT INTO demo01 VALUES(1,'张三','运动');
-- 报错:Duplicate entry 'DBJ' for key 'hobby'
INSERT INTO demo01 VALUES(2,'李四','运动');
index -- 普通索引
最常见的索引,作用就是加快对数据的访问速度。
只为那些最经常出现在查询条件或排序条件中的数据列创建普通索引。
-- 使用 create 语句添加唯一索引
CREATE INDEX dname_index ON demo01(dname);
-- 通过表结构删除索引
ALTER TABLE demo01
DROP INDEX dname_index;
-- 通过表结构添加索引
ALTER TABLE demo01
ADD INDEX dname_index(dname);
删除索引
由于索引会占用一定的磁盘空间,因此,为了避免影响数据库的性能,应该及时删除不再使用的索引
-- 删除 demo01 表中名为 dname_indx 的普通索引。
ALTER TABLE demo01 DROP INDEX dname_indx;
索引的优缺点总结
- 添加索引首先应考虑在 where 及 order by 涉及的列上建立索引。
- 优点:1. 大大的提高查询速度;2. 可以显著的减少查询中分组和排序的时间。
- 缺点:1. 创建索引和维护索引需要时间,而且数据量越大时间越长。2. 当对表中的数据进行增加、修改、删除的时候,索引也要同时进行维护,降低了数据的维护速度。
MySQL 视图
-
什么是视图
1 . 视图是一种虚拟表。
2 . 视图建立在已有表的基础上,视图赖以建立的这些表称为基表。
3 . 向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句。
4 . 视图向用户提供基表数据的另一种表现形式。
-
视图的作用
视图可以在权限控制时使用。比如,某几个列可以运行用户查询,其他列不允许,可以开通视图查询特定的列,起到权限控制的作用。
视图可以简化复杂的多表查询。视图本身就是一条查询 SQL,可以将一次复杂的查询构建成一张视图,用户只要查询视图就可以获取想要得到的信息(不需要再编写复杂的 SQL)。
-
视图的使用
创建视图
- 语法格式:--> create view 视图名 [column_list] as select语句;
-- view: 表示视图;
-- column_list: 可选参数,表示属性清单,指定视图中各个属性的名称,默认情况下,与SELECT语句中查询 的属性相同 ;
-- as : 表示视图要执行的操作 ;
-- select语句: 向视图提供数据内容;
-- 创建视图
-- 先编写查询语句
-- 查询所有商品和商品的对应分类信息
SELECT *
FROM
products p
LEFT JOIN
category c
ON
p.`category_id` = c.`cid`;
-- 基于上面的查询语句,创建视图
CREATE VIEW products_category_view
AS
SELECT *
FROM
products p
LEFT JOIN
category c
ON
p.`category_id` = c.`cid`;
-- 查询视图,当做一张只读的表来操作
SELECT * FROM products_category_view;
通过视图进行查询
-- 需求1:查询各个分类下的商品平均价格
-- 方式一:通过多表查询
SELECT
cname AS '分类名称',
AVG(p.`price`) AS '平均价格'
FROM
products p
LEFT JOIN
category c
ON
p.`category_id` = c.`cid`
GROUP BY c.`cname`;
-- 方式二:通过视图查询省略了连接表的操作
SELECT
cname AS '分类名称',
AVG(price) AS '平均价格'
FROM products_category_view
GROUP BY cname;
-- 需求2:查询鞋服分类下最贵的商品的全部信息
-- 方式一:通过连表查询
SELECT *
FROM
products p
LEFT JOIN
category c
ON
p.`category_id` = c.`cid`
WHERE
c.`cname` = '鞋服'
AND
p.`price` = (
SELECT
MAX(price) AS maxPrice
FROM
products p
LEFT JOIN
category c
ON
p.`category_id` = c.`cid`
WHERE c.`cname` = '鞋服');
-- 方式二:通过视图查询
SELECT *
FROM products_category_view pcv
WHERE
pcv.`cname` = '鞋服'
AND
pcv.`price` = (
SELECT MAX(price)
FROM products_category_view
WHERE cname = '鞋服'
);
视图与表的区别
-- 视图是建立在表的基础上,表存储数据库中的数据,而视图只是做一个数据的展示。
-- 通过视图不能改变表中数据(一般情况下视图中的数据都是表中的列经过计算得到的结果,不允许更新)。
-- 删除视图,表不受影响,而删除表,视图不再起作用。
MySQL 存储过程
-
什么是存储过程
MySQL 5.0 版本开始支持存储过程。
存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户在需要时可通过指定存储过程的名字并给定参数来调用执行。
简单来说,存储过程其实就是一堆 SQL 语句的合并,中间加入了一些逻辑控制。
-
存储过程的优缺点
优点:
存储过程一旦调试完成后,就可以稳定运行。前提是业务需求要相对稳定没有变化。
存储过程减少业务系统与数据库的交互,降低耦合,使数据库交互更加快捷,适合应用服务器与数据库服务器不在同一个地区的情况。
缺点:
互联网行业需求变化较快,MySQL 的存储过程与 Oracle 相比较弱,所以较少使用。
存储过程可以在简单的逻辑中使用,但是移植十分困难。特别是在数据库集群环境,要保证各个库之间存储过程变更一致也十分困难。阿里巴巴的代码规范里也提出了禁止使用存储过程,因为存储过程维护起来的确麻烦。
-
存储过程的创建方式
-- 创建商品表与订单表
-- 商品表,num 为库存
CREATE TABLE goods(
gid INT,
NAME VARCHAR(20),
num INT
);
-- 订单表,price 为订单价格
CREATE TABLE orders(
oid INT,
gid INT,
price INT
);
-- 向商品表中添加3条数据
INSERT INTO goods VALUES(1,'奶茶',20);
INSERT INTO goods VALUES(2,'绿茶',100);
INSERT INTO goods VALUES(3,'花茶',25);
-- 方式一:编写简单存储过程
-- 查询所有商品数据
-- 一般使用 $$ 为语句结束符
DELIMITER $$
CREATE
PROCEDURE
goods_proc()
BEGIN
select * from goods;
END $$
-- 调用存储过程查询 goods 表数据
call goods_proc;
-- 方式二:创建接收参数的存储过程
-- 接收一个商品 id,根据 id 删除数据
DELIMITER $$
CREATE
PROCEDURE
goods_proc02(
IN goods_id INT
)
BEGIN
DELETE FROM goods
WHERE gid = goods_id;
END $$
-- 调用存储过程传递参数,删除对应的商品
CALL goods_proc02(2);
-- 方式三:使用输出参数创建存储过程
-- 接收参数插入数据, 并返回受影响的行数
DELIMITER $$
CREATE
PROCEDURE
orders_proc(
IN o_oid INT,
IN o_gid INT,
IN o_price INT,
OUT out_num INT
)
BEGIN
-- 执行插入操作
INSERT INTO orders
VALUES(o_oid,o_gid,o_price);
-- 设置 num 的值为 1
SET @out_num = 1;
-- 返回 out_num的值
SELECT @out_num;
END $$
-- 调用存储过程插入数据,获取返回值
CALL orders_proc(1,2,30,@out_num);
MySQL触发器
-
什么是触发器
触发器是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行增删改操作时就会激活它执行。
可以把触发器理解为:当执行一条 SQL 语句的时候,这条 SQL 语句的执行会自动去触发执行其他的 SQL 语句。
-
触发器创建的四个要素
监视地点 -- table
监视事件 -- insert/update/delete
触发时间 -- before/after
触发事件 -- insert/update/delete
-
创建触发器
在一个数据库中触发器名是唯一的。
-- 向商品中添加一条数据
INSERT INTO goods VALUES(1,'书本',40);
-- 编写触发器
-- 卖出商品之后减少库存量
-- 修改结束标识,避免执行出现错误
DELIMITER $
-- 创建触发器 t1
CREATE TRIGGER t1
-- 指定触发的时机,和要监听的表
AFTER INSERT ON orders
-- 行触发器 固定写法
FOR EACH ROW
# 触发后具体要执行的事件
BEGIN
# 订单+1,库存-1
UPDATE goods
SET num = num - 1
WHERE gid = 1;
END$
-- 向订单表中添加一条数据
# 添加后,触发器执行,库存自动减一
INSERT INTO orders VALUES(1,1,25);
DCL(数据控制语言)
MySQL 默认使用的都是 root 用户,超级管理员,拥有全部的权限。除了 root 用户以外,我们还可以通过 DCL 来定义一些权限较小的用户,分配不同的权限来管理和维护数据库。
创建用户
格式:create user '用户名'@'主机名' identified by '密码';
-- 创建 admin1 用户
--只能在 localhost 这个服务器登录 mySQL 服务器,密码为 123456
CREATE USER 'admin1'@'localhost' IDENTIFIED BY '123456';
-- 创建 admin2 用户
--可以在任何电脑上登录 mySQL 服务器,密码为 123456
CREATE USER 'admin2'@'%' IDENTIFIED BY '123456';
用户授权
格式:grant 权限1,权限2..... on 数据库名.表名 to '用户名'@'主机名';
-- 给 admin1 用户分配对 db4 数据库中 products 表的查询权限
GRANT SELECT ON db4.products TO 'admin1'@'localhost';
-- 给 admin2 用户分配所有权限和操作所有数据库的所有表
GRANT ALL ON *.* TO 'admin2'@'%';
查看用户权限
格式:show grant for '用户名'@'主机名';
-- 查看 root 用户的权限
-- GRANT ALL PRIVILEGES 是表示所有权限
SHOW GRANTS FOR 'root'@'localhost';
删除用户&查询用户
-- 删除 admin1 用户
DROP USER 'admin1'@'localhost';
-- 查询所有用户
SELECT * FROM USER;
数据库备份&还原
备份的应用场景:在服务器进行数据传输、数据存储、数据交换时,就有可能产生数据故障。比如,发生意外停机或存储介质损坏。 此时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。
-
SQLYog 数据备份
首先,选中要备份的数据库,右键选择“备份/导出”,选择“备份数据库”;然后指定文件位置,选择导出即可。
-
SQLYog 数据恢复
首先,导入备份的 SQL 文件,选中用户名,右键选择“执行 SQL 脚本”;然后选择文件位置,点击执行即可。
-
命令行备份
执行备份,备份 db1 中的数据到 D 盘的 db1.sql 文件中:
mysqldump -uroot -proot db1 > D:/db1.sql
-
命令行恢复
还原 db1 数据库中的数据(注意:还原的时候需要先创建一个 db1 数据库 ):
use db1;
source 文件地址