1、描述视图,存储过程,函数,触发器分别是什么并实践
视图是保存实表的查询结果,是一种虚表,方便我们下次查询,对视图修改会间接修改表。
创建视图
create view view_test as select stuid,name from stydents;
查看视图结构
desc view_test;
查看视图内容,发现和我们当初查看表的结果是一样的
select * from view_test;
怎么判断是不是视图呢
show table status like 'view_test'\G
其中comment: VIEW 显示就是视图
删除视图
drop view view_tset;
存储过程
存储过程把SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用。
创建无参存储过程
delimiter //
create procedure showtime ()
begin select now()
end//
delimiter ;
调用存储过程
call showtime;
创建含参存储过程:包含IN参数和OUT参数
delimiter //
CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num
SMALLINT UNSIGNED)
BEGIN
DELETE FROM students WHERE stuid >= uid;
SELECT row_count() into num;
END//
delimiter ;
call deleteById(2,@Line);
SELECT @Line;
说明:创建存储过程deleteById,包含一个IN参数和一个OUT参数.调用时,传入删
除的ID和保存被修改的行数值的用户变量@Line,select@Line;输出被影响行数
函数
函数是事先经过编译并且存储在数据库中的一段SQL语句集合,不是独立的
创建没有参数的函数
create function hello() returns varchar(20) return "hello world!";
查看函数:
select hello();
查看函数定义
show create function hello\G;
删除UDF:
dorp function hello
创建有参数的函数
DELIMITER // //代替; 从而遇到;不会执行
CREATE FUNCTION deleteById(uid SMALLINT
UNSIGNED) RETURNS
VARCHAR(20)
BEGIN
DELETE FROM students WHERE stuid = uid;
RETURN (SELECT COUNT(stuid) FROM students);
END//
DELIMITER ;
select deleByld(10);
输入要删除的uid 从而返回查询的结果
触发器
触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行
创建触发器,在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少
CREATE TRIGGER trigger_student_count_insert
AFTER INSERT
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count+1;
CREATE TRIGGER trigger_student_count_delete
AFTER DELETE
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count-1;
trigger_name:触发器的名称
trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发
trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件
tbl_name:该触发器作用在表名
查看触发器
SHOW TRIGGERS
删除触发器,如果删除表,则表中的触发器也会被删除。
DROP TRIGGER trigger_name;
2、描述MySQL中有哪些存储引擎并描述各自的区别
InnoDB引擎特点
行级锁
支持事务,适合处理大量短期事务
读写阻塞与事务隔离级别相关
可缓存数据和索引
支持聚簇索引
崩溃恢复性更好
支持MVCC高并发
从MySQL5.5后支持全文索引
从MySQL5.5.5开始为默认的数据库引擎
MyISAM引擎特点
不支持事务
表级锁定
读写相互阻塞,写入不能读,读时不能写
只缓存索引
不支持外键约束
不支持聚簇索引
读取数据较快,占用资源较少
不支持MVCC(多版本并发控制机制)高并发
崩溃恢复性较差
MySQL5.5.5前默认的数据库引擎
Performance_Schema:Performance_Schema数据库使用
Memory :将所有数据存储在RAM中,以便在需要快速查找参考和其他类似
数据的环境中进行快速访问。适用存放临时数据。引擎以前被称为HEAP引擎
MRG_MyISAM:使MySQL DBA或开发人员能够对一系列相同的MyISAM表
进行逻辑分组,并将它们作为一个对象引用。适用于VLDB(Very Large Data
Base)环境,如数据仓库
Archive :为存储和检索大量很少参考的存档或安全审核信息,只支持
SELECT和INSERT操作;支持行级锁和专用缓存区
Federated联合:用于访问其它远程MySQL服务器一个代理,它通过创建一
个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,而
后完成数据存取,提供链接单独MySQL服务器的能力,以便从多个物理服务
器创建一个逻辑数据库。非常适合分布式或数据集市环境
BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性
Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的
应用程序,这类查找需求还要求具有最高的正常工作时间和可用性
CSV:CSV存储引擎使用逗号分隔值格式将数据存储在文本文件中。可以使用
CSV引擎以CSV格式导入和导出其他软件和应用程序之间的数据交换
BLACKHOLE :黑洞存储引擎接受但不存储数据,检索总是返回一个空集。该功
能可用于分布式数据库设计,数据自动复制,但不是本地存储
example:“stub”引擎,它什么都不做。可以使用此引擎创建表,但不能将数
据存储在其中或从中检索。目的是作为例子来说明如何开始编写新的存储引擎
3、描述索引的工作原理并创建各种索引
索引:是特殊数据结构,定义在查找时作为查找条件的字段,在MySQL又称为键key,索引通过存储引擎实现,
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
优点:
索引可以降低服务需要扫描的数据量,减少了IO次数
索引可以帮助服务器避免排序和使用临时表
索引可以帮助将随机I/O转为顺序I/O
缺点:
占用额外空间,影响插入速度
索引类型:
B+ TREE、HASH、R TREE
聚簇(集)索引、非聚簇索引:数据和索引是否存储在一起
主键索引、二级(辅助)索引
稠密索引、稀疏索引:是否索引了每一个数据项
简单索引、组合索引
B+Tree索引:顺序存储,每一个叶子节点到根结点的距离是相同的;左前缀索引,适合查询范围类的数据
可以使用B+Tree索引的查询类型:
全值匹配:精确所有索引列,如:姓wang,名xiaochun,年龄30
匹配最左前缀:即只使用索引的第一列,如:姓wang
匹配列前缀:只匹配一列值开头部分,如:姓以w开头的
匹配范围值:如:姓ma和姓wang之间
精确匹配某一列并范围匹配另一列:如:姓wang,名以x开头的
只访问索引的查询
B+Tree索引的限制:
如不从最左列开始,则无法使用索引,如:查找名为xiaochun,或姓为g结尾
不能跳过索引中的列:如:查找姓wang,年龄30的,只能使用索引第一列
如果查询中某个列是为范围查询,那么其右侧的列都无法再使用索引:如:姓wang,名x%,年龄30,只能利用姓和名上面的索引
特别提示:
索引列的顺序和查询语句的写法应相匹配,才能更好的利用索引
为优化性能,可能需要针对相同的列但顺序不同创建不同的索引来满足不同类型的查询需求
Hash索引:基于哈希表实现,只有精确匹配索引中的所有列的查询才有效,索
引自身只存储索引列对应的哈希值和数据指针,索引结构紧凑,查询性能好
Memory存储引擎支持显式hash索引,InnoDB和MyISAM存储引擎不支持
适用场景:只支持等值比较查询,包括=, <=>, IN()
不适合使用hash索引的场景
不适用于顺序查询:索引存储顺序的不是值的顺序
不支持模糊匹配
不支持范围查询
不支持部分索引列匹配查找:如A,B列索引,只查询A列索引无效
创建索引
create index idx_name on students(name);
对 students 这个表中的name字段创建索引。
查看students表中的索引
show index from students\G;
![](https://upload-images.jianshu.io/upload_images/18546556-0b8a5a2d8ba5269c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
创建复合索引
create index idx_name_age on students(name,age);
注意复合索引 要照着顺序进行查询
唯一键索引 ,这个字段不能有相同的
create unique index un_name on students(name);
删除索引
drop index idx_gae on students;
4、总结binlog备份方法,用脚本实现每小时备份binlog
sql_log_bin=ON|OFF:是否记录二进制日志,默认ON
log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可
binlog_format=STATEMENT|ROW|MIXED:二进制日志记录的格式,默认STATEMENT
mysqlbinlog 二进制客户端命令工具,用它进行备份还原
mysqlbinlog centos7-bin.000001 -v 可以看到我们对于数据库的操作,那么就可以把它导出,mysqlbinlog centos7-bin.000001 -v > binlog.sql
修改错误的操作 就可以 再次导入,就做到了还原备份 mysql < binlog.sql
脚本备份
#!/bin/bash
for i in `ls /var/lib/mysql/ | grep mariadb.*[0-9]`;do
mysqlbinlog /var/lib/mysql/$i -v > /data/${i}.sql
done
计划任务
crontab -e
* */1 * * * /data/binlog.sh