基础练习13

1、描述视图,存储过程,函数,触发器分别是什么并实践

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。表现为对实体表的查询结果,查完之后存储在视图。方便下次查询

  通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。


创建视图 

create view v_students as select stuid,name,age from students;

创建视图,将查询结果存储成视图。可方便查询

原始表

视图生成的表

查看表状态。comment表示了是view表。表示为视图


函数

create function hello() returns varchar(20) return "hello world!";

创建一个无参数的函数。返回字符串。具体返回为 hello world 实现一个打印字符串功能

查看函数定义


创建有参数的函数

MariaDB [hellodb]> delimiter // #将命令执行;号变成 //方便区分。在定义函数内部要执行的命令时。如果出现;号将不会执行

MariaDB [hellodb]> create function del(uid int unsigned) returns varchar(20) #创建函数。添加一个个uid参数,并指定类型为数字。返回结果为字符串

    -> begin # 函数的开始

    -> delete from students where stuid = uid ; 删除一条记录。这条记录为你输入的数字

    -> return (select count(stuid) from students);返回一个查询结果

    -> end//

delimiter

select del(25)#调用函数并传递25位参数

[hellodb]> CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED) #定义两个行参的函数。类型为数字。

    -> RETURNS SMALLINT #返回结果为数字

    -> BEGIN #开始

    -> DECLARE a, b SMALLINT UNSIGNED; 声明为局部变量。a和b。只在函数内部生效。函数执行完毕后失效

    -> SET a = x, b = y; #将本地变量赋值为形参

    -> RETURN a+b; #返回结果

    -> END// #结束




存储过程(procedure)类似shell中的函数。在函数体内部可以放一系列命令。然后通过存储过程调用,


delimiter // #临时更改命令执行的符号

create procedure showtime()  #创建存储过程

begin select now(); #函数体定义

end// #结尾

call showtime; #调用存储过程执行


MariaDB [hellodb]> delimiter //

MariaDB [hellodb]> CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED) #创建存储过程。并且定义参数

    -> BEGIN #存储过程内容

    -> SELECT * FROM students WHERE stuid = uid; #查询表并且赋值给形参uid

    -> END// #结束

MariaDB [hellodb]> delimiter ; 修改执行符号


delimiter //

CREATE PROCEDURE dorepeat(n INT) #定义存储过程,和形式参数n,并定义类型

BEGIN 

SET @i = 0; #设置会话变量。变量不会随着存储过程结束而消息,会在会话中一直生效

SET @sum = 0; #同上

REPEAT SET @sum = @sum+@i; SET @i = @i + 1;#重复执行 

UNTIL @i > n END REPEAT;#限制。如果变量i大于传入的参数时则循环结束

END//

delimiter ;

CALL dorepeat(100);#调用存储过程,将形100赋值给形参n

SELECT @sum; #查询结果




触发器

触发器执行的不是由程序调用,也不是手工启动,而是通过事件来触发,激活从而执行

CREATE TABLE student_info (

stu_id INT(11) NOT NULL AUTO_INCREMENT,

stu_name VARCHAR(255) DEFAULT NULL,

PRIMARY KEY (stu_id)

);

CREATE TABLE student_count (

student_count INT(11) DEFAULT 0

);

insert into student_count values(0);

创建两张表。实现在info中增加学生时。count数量加1,减少info记录时,则count则减少数量

创建触发器(增加触发)

CREATE TRIGGER trigger_student_count_insert #创建触发器

AFTER INSERT  #表示在insert命令之后触发,触发器执行 如果是before则在触发器之前执行。表示代替后面的动作

ON student_info FOR EACH ROW #表示对这个表改了多少行就触发几次触发器

UPDATE student_count SET student_count=student_count+1; #更新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;



当我们往info表中插记录时。count表则增加数量

当我们删除记录时。在查看count表则发现会自动减少

查看触发器

删除触发器 drop trigger name;如果删除表。则在表中的触发器则也会删除。

2、描述MySQL中有哪些存储引擎并描述各自的区别

存储引擎是MySQL组件,用于处理不同表类型的SQL操作。MySQL存储引擎既包括处理事务安全表的表,也包括处理非事务安全表的表。InnoDB是MySQL 5.5.5的默认存储引擎(CREATE TABLEMySQL 5.5中的 语句InnoDB默认创建表

在mysql5.1中默认为myisam存储引擎。现在的新版本都已经默认为innodb存储引擎

show engines;查看mysql中的各种存储引擎

常见存储引擎对比图

MyISAM引擎特点

不支持事务

表级锁定不支持行级锁

读写相互阻塞,写入不能读,读时不能写

只缓存索引

不支持外键约束

不支持聚簇索引

读取数据较快,占用资源较少

不支持MVCC(多版本并发控制机制)高并发

崩溃恢复性较差

MySQL5.5.5前默认的数据库引擎


InnoDB引擎特点

行级锁

支持事务,适合处理大量短期事务

读写阻塞与事务隔离级别相关

可缓存数据和索引

支持聚簇索引

崩溃恢复性更好

支持MVCC高并发

从MySQL5.5后支持全文索引

从MySQL5.5.5开始为默认的数据库引擎

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索引:顺序存储,每一个叶子节点到根结点的距离是相同的;左前缀索引,适合查询范围类的数据

可以使用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列索引无效



空间数据索引R-Tree( Geospatial indexing )

MyISAM支持地理空间索引,可以使用任意维度组合查询,使用特有的函数访问,常用于做地理数据存储,使用不多

InnoDB从MySQL5.7之后也开始支持

全文索引(FULLTEXT)

在文本中查找关键词,而不是直接比较索引中的值,类似搜索引擎

InnoDB从MySQL 5.6之后也开始支持


数据和索引放在同一个文件的为聚簇索引,数据和索引分开存放的为非聚簇索引

主键索引:数据和主键索引都存放在叶子节点(一个数据块中)

二级索引:索引和主键放在一起需要二级索引查一次,在利用主键索引查询

建立索引

当我们建立表的时候标识出了主键时。则索引就会自动建立


查看查询时有无利用索引查询  possible_keys=primary 可能利用主键的索引

key=primary 真正结果为主键索引

rows=1 查询了1行。

type=all 全表扫描,possible_keys=null key=null 没有索引。rows=100286.扫描了100286行

create index index_name on testlog(name); 对name字段建立索引

如果字段前几个字节相同,我们也可以对字段建立多少个字节的索引

create index index_name on testlog(name(10)); 

查看表索引

创建复合索引

create index index_name_age on students(name,age);


要利用复合索引,必须要按顺序来搜索如,定义了name在前,age在后,如果不先对name索引,而对age作为搜索条件则索引会失效


需要先对前一个索引name搜索,而后在用后一个索引age才能利用索引

查看索引的使用

SET GLOBAL userstat=ON;

SHOW INDEX_STATISTICS;


如果发现建立的索引没有用过,就可以考虑删除索引

DROP INDEX index_name ON tbl_name;

唯一键索引 如果对字段建立索引。则这个字段内容就不能相同

create unique index un_name on students(name); 创建唯一键索引



4、总结binlog备份方法,用脚本实现每小时备份binlog

要启用binlog,首先需要开启二进制日志。有两个选项和二进制日志文件相关

sql_log_bin=ON|OFF:是否记录二进制日志,默认ON

log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可

binlog_format=STATEMENT|ROW|MIXED:二进制日志记录的格式,默认STATEMENT 建议改成行级别row

在配置文件 /etc/my.cnf 中加入 log_bin后面如果不加路径默认和数据库路径放在一起,名字会使用默认系统的名字

利用mysqlbinlog管理和备份还原

查看二进制日志文件

查看当前正在使用的二进制日志文件

mysqlbinglog工具使用

mysqlbinlog /var/lib/mysqlcentos7-bin.000001

直接查看二进制文件内容


当我们往表里插入记录时。二进制文件会记录下来

mysqlbinlog centos7-bin.000001 -v 利用-v选项查看详细记录,会发现我们做的操作都会记录在二进制日志中

mysqlbinlog /var/lib/mysql/centos7-bin.000001--start-position=507 --stop-position=564 可以利用位置查看二进制内容。 在日志内at 后面的数字表示为位置

也可以利用时间挑出一部分二进制日志的内容

mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" centos-bin.000003 -vvv


我们可以利用二进制的特性来做备份和还原

为了掩饰方便,刷新一下日志

在表中插入记录



执行破坏性操作

delete from teachers;

将二进制文件导出

mysqlbinlog /var/lib/mysql/centos7-bin.000003 -v > /root/mysqllog.sql

将delete语句删除之后,

mysql  < mylog.sql 导入日志。还原

建议二进制日志需要配合完全备份来使用,如果drop 表,二进制文件如果没记录表结构,则还原会失败


编写脚本执行每小时执行备份

#!/bin/bash

for i in `ls /var/lib/mysql/ | grep centos.*[0-9]$`;do

        mysqlbinlog /var/lib/mysql/$i -v > /root/${i}.sql`date +"%F-%T`

done


写入计划任务中

然后就能每小时执行定期备份了

你可能感兴趣的:(基础练习13)