MySQL學習(5)

三 觸發器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 或 countNULL,則返回 NULLREPLACE(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

相關文章
相關標籤/搜索