三 觸發器html
對某個表進行某種操做(如:增刪改查),但願觸發某個動做,可使用觸發器。mysql
1.建立觸發器sql
create trigger trigger1_before_insert_tb1 before insert on tb1 for each row begin ... end
before能夠換成after, insert能夠換成delete,update.
在想tb1插入數據後,tb2結果:數據庫
觸發器得到用戶提交的數據:數據結構
create trigger tri_after_insert_tb1 after insert on tb1 for each row begin NEW.nid (爲用戶新提交過來的 tb1.nid的值) NEW.name(爲用戶新提交過來的tb1.name的值) insert into tb2(num) values(NEW.nid); end create trigger tri_after_delete_tb1 after delete on tb1 for each row begin OLD.nid (爲刪除的tb1.nid的值) OLD.name(爲刪除的tb1.name的值) insert into tb2(num) values(OLD.nid); end create trigger tri_after_update_tb1 after update on tb1 for each row begin NEW.nid (爲用戶新提交過來的 tb1.nid的值) NEW.name(爲用戶新提交過來的tb1.name的值) OLD.nid (爲刪除的tb1.nid的值) OLD.name(爲刪除的tb1.name的值) insert into tb2(num) values(OLD.nid),(New.nid); end
2. 刪除觸發器less
drop trigger tri_after_insert_tb1;
3. 使用觸發器:調用觸發條件便可。ide
四 事務函數
事務多用於原子性操做,一旦某個操做引發了錯誤或者警告,能夠回滾到原來的狀態,保持數據庫的完整性。優化
delimiter // create procudureprocudure1( OUT return varchar(20) ) begin declare exit handler for sqlexception --發生錯誤會執行的程序代碼塊 begin -- ERROR set return = "Error"; rollback; end; declare exit handler for sqlwarning --發生警告會執行的程序代碼塊 begin -- WARNING set return = "Warn"; rollback; end; start transaction; delete from table1; insert into table2(name) values('damon'); --若是這條命令和上條命令出現錯誤或警告,會執行上面錯誤代碼塊或警告代碼塊 commit; -- SUCCESS set return = "Success "; --若是ransaction代碼塊中沒有錯誤發生,就會執行到這條命令 END// delimiter ;
四 函數ui
CHAR_LENGTH(str) 返回值爲字符串str 的長度,長度的單位爲字符。一個多字節字符算做一個單字符。 對於一個包含五個二字節字符集, LENGTH()返回值爲 10, 而CHAR_LENGTH()的返回值爲5。 CONCAT(str1,str2,...) 字符串拼接 若有任何一個參數爲NULL ,則返回值爲 NULL。 CONCAT_WS(separator,str1,str2,...) 字符串拼接(自定義鏈接符) CONCAT_WS()不會忽略任何空字符串。 (然而會忽略全部的 NULL)。 CONV(N,from_base,to_base) 進制轉換 例如: SELECT CONV('a',16,2); 表示將 a 由16進制轉換爲2進制字符串表示 FORMAT(X,D) 將數字X 的格式寫爲'#,###,###.##',以四捨五入的方式保留小數點後 D 位, 並將結果以字符串的形式返回。若 D 爲 0, 則返回結果不帶有小數點,或不含小數部分。 例如: SELECT FORMAT(12332.1,4); 結果爲: '12,332.1000' INSERT(str,pos,len,newstr) 在str的指定位置插入字符串 pos:要替換位置其實位置 len:替換的長度 newstr:新字符串 特別的: 若是pos超過原字符串長度,則返回原字符串 若是len超過原字符串長度,則由新字符串徹底替換 INSTR(str,substr) 返回字符串 str 中子字符串的第一個出現位置。 LEFT(str,len) 返回字符串str 從開始的len位置的子序列字符。 LOWER(str) 變小寫 UPPER(str) 變大寫 LTRIM(str) 返回字符串 str ,其引導空格字符被刪除。 RTRIM(str) 返回字符串 str ,結尾空格字符被刪去。 SUBSTRING(str,pos,len) 獲取字符串子序列 LOCATE(substr,str,pos) 獲取子序列索引位置 REPEAT(str,count) 返回一個由重複的字符串str 組成的字符串,字符串str的數目等於count 。 若 count <= 0,則返回一個空字符串。 若str 或 count 爲 NULL,則返回 NULL 。 REPLACE(str,from_str,to_str) 返回字符串str 以及全部被字符串to_str替代的字符串from_str 。 REVERSE(str) 返回字符串 str ,順序和字符順序相反。 RIGHT(str,len) 從字符串str 開始,返回從後邊開始len個字符組成的子序列 SPACE(N) 返回一個由N空格組成的字符串。 SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len) 不帶有len 參數的格式從字符串str返回一個子字符串,起始於位置 pos。帶有len參數的格式從字符串str返回一個長度同len字符相同的子字符串,起始於位置 pos。 使用 FROM的格式爲標準 SQL 語法。也可能對pos使用一個負值。倘若這樣,則子字符串的位置起始於字符串結尾的pos 字符,而不是字符串的開頭位置。在如下格式的函數中能夠對pos 使用一個負值。 mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3); -> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3); -> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki' TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str) 返回字符串 str , 其中全部remstr 前綴和/或後綴都已被刪除。若分類符BOTH、LEADIN或TRAILING中沒有一個是給定的,則假設爲BOTH 。 remstr 爲可選項,在未指定狀況下,可刪除空格。 mysql> SELECT TRIM(' bar '); -> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx' 部份內置函數
參考博客:https://www.cnblogs.com/wupeiqi/articles/5713323.html 十分感謝!
自建函數 delimiter // create function f1(arg1 int, arg2 int) returns int begin declare num int; set nuim = arg1 + arg2; return (num); end// delimiter ;
在建立函數的時候報錯:
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
須要 調用命令: set global log_bin_trust_function_creators=TRUE;就能夠了。
函數與存儲過程的不一樣點:
1.函數裏不能返寫SQL語句,存儲過程能夠。
但函數中能夠這樣使用:
set id = 0;
select nid into id form student where name = 'damon';
2.函數經過return返回返回值,存儲過程經過參數返回返回值。
刪除函數:
drop fucntion f1;
調用函數;
select f1(1, 2);
五 索引(重要程度 *******)
索引是數據庫中專門用於快速查找數據的一種數據結構,其內部使用紅黑查找樹,因此能夠快速查找到數據。功能:創建索引加快尋找;約束;
種類:
普通索引:加速查找;
惟一索引:加速查找,約束列數據不能重複,能夠爲null;
主鍵索引:加速查找,約束列數據不能重複,不能夠爲Null;
組合索引:多列組合建立一個索引文件;
1. 普通索引
create table tb1( nid int not null auto_increment primary key, name varchar(20) not null, index ix_name(name) } --建立表時,將name列做爲索引
create index ix_name on tb1(name)
drop ix_name on tb1
show index from tb1
注意:若是建立索引是BLOB或者TEXT類型時,須要指定長度。
2. 惟一索引
create table tb2( nid int null auto_increment primary key, name varchar(20) not null, unique ix_name(name) )
create unique index ix_name on tb2(name)
drop unique index ix_name on tb2
3. 主鍵索引
建立主鍵索引就是建立主鍵;
4. 組合索引
在建立索引的時候,選擇兩個列名。規則:最左匹配,根據建立索引時,最左側的列名爲根據,判斷是否走索引。
a. 普通組合索引: 無約束。
b. 聯合位移組合索引:有約束,兩列數據同時不相同,才能插入。
5. 執行計劃
相對比較準確表達當前SQL運行情況。
explain SQL語句;
type = ALL 全數據表掃描;效率低。
type = index 全索引表掃描;效率低。
在SQL語句後加 limit 會提升效率。
type 是 ALL 或者Index時,都是有優化的餘地。
6. 如何命中索引
(1) like '%xx': select * from tb where name like '%om' 不走索引 like 'da%'走索引
(2) 使用函數:select * from tb where reverse(name) = 'damon'
(3) 使用or :select* from tb where nid = 1 or name = 'damon'; nid和name都是索引就不走索引
(4) 類型不一致:select * from tb where name = 1;
(5) 使用!=: select * from tb where name != 'damon';當name不是主鍵時,不會走索引,反之,走索引;
(6) 使用 >:select * from tb where name > 'alex'; 若是主鍵是索引仍是整數類型,則仍是會走索引。
(7) 使用order by:select email from tb order by email,name;當根據索引排序時,若是映射不是索引,則不會走索引。若是對主鍵排序,則仍是走索引;
(8) 注意事項
a. 避免使用select * ;
b. 儘可能使用char代替varchar;
c. 表的字段順序固定長度的字段優先;
d. 當時用多個條件查詢時,多使用組合索引代替單個索引;
e. 儘可能使用短索引;
f. 使用鏈接(JOIN)代替子查詢(Sub-Queries);
g. 連表時注意條件類型須一致;
h. 索引散列(重複少), 不適合建索引。例:性別;
六 分頁
若是數據量比較大時,越到後面使用limit分頁的效率越低,解決方案:
where nid > 1000000 limit x, m 直接跳過前1000000數據,往下掃描。
七 慢日誌查詢
1. 內存中配置MySQL自動記錄慢日誌。
2. 寫一個配置文件*.ini, 在配置文件中修改,而後重啓。
指定配置文件: mysqld --default files = D:/mysql/default.ini;
3. 在修改時,建議兩種方式都修改。
slow_query_log = ON 開啓慢日誌記錄 long_query_time = 0.5 超過此時間,則記錄 slow_query_log_file = D:/usr/slow.log 日誌文件路徑 log_queries_not_using_indexes = ON 爲使用索引的搜索是否記錄
4.查看慢日誌
mysqldumpslow -s at -a /usr/slow.log