第13周做業

一、描述視圖,存儲過程,函數,觸發器分別是什麼並實踐java

視圖(view)是一種虛擬存在的表,是一個邏輯表,自己並不包含數據。表現爲對實體表的查詢結果,查完以後存儲在視圖。方便下次查詢
  經過視圖,能夠展示基表的部分數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。
建立視圖 
create view v_students as select stuid,name,age from students;

建立視圖,將查詢結果存儲成視圖。可方便查詢

show table status like "v_students" \G
查看錶狀態。comment表示了是view表。表示爲視圖
存儲過程(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 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// #結束
 
 
觸發器

觸發器執行的不是由程序調用,也不是手工啓動,而是經過事件來觸發,激活從而執行

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;若是刪除表。則在表中的觸發器則也會刪除。

 

二、描述MySQL中有哪些存儲引擎並描述各自的區別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」引擎,它什麼都不作。可使用此引擎建立表,但不能將數據存儲在其中或從中檢索。目的是做爲例子來講明如何開始編寫新的存儲引擎

三、描述索引的工做原理並建立各類索引react

 

1、概述

在mysql中,索引(index)又叫鍵(key),它是存儲引擎用於快速找到所需記錄的一種數據結構。在愈來愈大的表中,索引是對查詢性能優化最有效的手段,索引對性能影響很是
關鍵。另外,mysql的索引是在存儲引擎層實現,而不是在服務器層。 2、索引的工做原理 咱們知道,在看一本書某章的時候,首先咱們會查找目錄索引,找到對應的頁碼而後快速找到相應的內容。mysql索引也同樣,存儲引擎利用相似的方法使用索引,先在索引中找到
對應的值,而後根據匹配的索引記錄找到對應的數據行,而後返回結果。 例如,咱們想在一個10W條記錄表 table 中查詢name等於「張三」的數據行,
select * from table where name ='張三'。那麼在沒有對name字段創建索引的狀況下,咱們
須要掃描全表也就是掃描10W條數據來找到這條數據;若是咱們爲name字段創建索引,咱們只須要查找索引,而後根據索引找到對應的數據行,只須要查找一條記錄,性能會獲得很
大的提升。 3、索引分類 索引按照實現方式不一樣能夠分爲 B
-Tree索引、hash索引、空間數據索引以及全文索引等。若是沒有特別指明,多半用的是B-Tree索引,B-Tree 對索引列是順序存儲的,所以很
適合查找範圍數據。它可以加快訪問數據的速度,由於存儲引擎再也不須要進行全表掃描來獲取須要的數據。 4、索引類型 索引主要分爲:單列索引(普通索引、主鍵索引、惟一索引)和組合索引。 普通索引: CREATE INDEX name_Index ON `table`(`name`);
ALTER TABLE table ADD INDEX name_Index(`name`) 惟一索引: CREATE UNIQUE INDEX id_UNIQUE_Index ON `table`(`id`); 主鍵索引:主鍵索引和惟一索引相似,惟一索引容許有空值,而主鍵索引不容許。 組合索引:通俗的說,組合索引就是一個表中一個索引包括多個字段,一個表中多個單列索引並非組合索引。 例如: 1 CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`); 5、組合索引的查詢規則(什麼狀況下有效,什麼狀況下無效) B-Tree 索引適用於全鍵值、鍵值範圍或鍵前綴查找,其中鍵前綴查找只適用於根據最左前綴查找。咱們創建表user(id,last_name,first_name, age ,birthday,sex),
創建組合索引 key(last_name, first_name, birthday),那麼它實際上包括三個索引(last_name),(last_name,first_name),
(last_name,first_name,birthday)。 下面咱們來分析組合索引有效以及無效的狀況,mysql在使用組合索引查詢的時候須要遵循「最左前綴」規則,什麼是「最左前綴」規則呢,就是在使用組合索引查詢,where的條件要
按照從左到右的順序,last_name first_name birthday,能夠是隻有last_name,或者包括last_name、first_name,或者last_name、first_name、birthday,這
個從左到右的順序不能變,也不能跳過;若是是直接first_name
='ruby' 組合索引不生效,或者跳過first_name,last_name=‘allon’ and birthday = ‘2012’,組合
索引只有last_name生效,後面的全部不生效。 例如:
1、全鍵值匹配:select * from user where last_name=‘allon’ and first_name='java' and birthday=‘2017-12'是生效的,
若是 select * from user where first_name=
'java' and birthday=‘2017-12'組合索引是不生效的,由於沒有key(first_name,birthday)的索引。 2、鍵前綴查找:select * from user where last_name=‘allon’;這個索引存在,也是有效的,但不能select * from user where first_name='java',這樣不生效。 3、like模糊查詢:好比只匹配組合索引第一列的值的開頭部分,查詢last_name姓張的人,select * from user where last_name like ‘張%’;
可是不能select * from user where last_name like ‘%張’;組合索引也沒法查找以張結尾的人。
再如 select * from user where last_name='allon' and first_name like '三%' and birthday = '2012-11-06'
由於first_name用了like這個範圍查詢條件,那麼查詢只用到了組合索引的前兩列,範圍查詢右面的列birthday沒法用索引優化查詢。 若是查詢中有某個列的範圍查詢,則該列右邊的全部列都沒法使用索引優化查找
4、匹配範圍值:select * from user where last_name between ’allon‘ and 'clitton';這裏只使用了組合索引的第一列,是生效的。 6、索引的優缺點 優勢:1、創建索引後,在查詢的時候合理利用索引可以提升數據庫性能; 2、主鍵索引 惟一索引能保證表中每一條數據的惟一性 3、減小分組和排序的時間 4、在錶鏈接的鏈接條件上使用索引,能夠加速表與表之間的相連。 缺點:1、建立索引和維護索引須要時間消耗; 2、索引文件佔用物理空間 3、當對錶的數據進行insert update delete時候須要維護索引,會下降數據的維護數據。

四、總結binlog備份方法,用腳本實現每小時備份binlogsql

要啓用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/mylog.sql 在導出的sql文件中,找到最後執行的delete語句,將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 寫入計劃任務中


而後就能每小時執行按期備份了
相關文章
相關標籤/搜索