1. 程式人生 > >MY-SQL-----資料庫---索引---儲存過程(後)

MY-SQL-----資料庫---索引---儲存過程(後)

   索引

索引是一種特殊的檔案,它們包含著對資料表裡所有記錄的引用指標。 它是對資料庫表中一列或多列的值進行排序的一種結構。 簡單理解 資料庫索引好比是一本書前面的目錄,能夠加快資料庫的查詢速度, 資料庫索引就是為了提高表的搜尋效率而對某些欄位中的值建立的目錄。

建立索引的目的是加快對錶中記錄的查詢或排序。 建立索引可以大大提高系統的效能 1,通過建立唯一家引,可以保證教據庫表中每一行資料的唯一性。 2,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。 3,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。 4.在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。 5,通過使用索引,可以在查詢的過程中,使用優化器,提高系統的效能。

索引的型別 1,普通索引 這是最基本的索引,它沒有任何限制。分別為單列索引和組合索引.

單列索引:即一個索引只包含單個列,一個表可以有多個單列索引 . 它有以下幾神建立方式:建立索引語法 create index  索引名 on 表名(表中的列名)

組合家引: 多列索引多列索引也稱組合索引,即一個索引巴含多個列。  建立多列索引的方式與建立單列索引的方式幾乎相同, 只是建立單列索引時括號中只寫上了一個列。 建立多列索引時在拮號中寫入多個列,列與列之間用退號隔開。 例如:為學生表(student_9)的姓名,電話號碼,所在地址建立組合案引,兩行程式碼效果相同 create index idx name phoneNo ads on student 9(name,phoneNo, address) alter table student_9 add index idx_name_phoneNo_ads(name, phoneNo, address)

如果使用多列索引, where條件中欄位的順序非常重要,需要滿足最左字首列 最左字首:查詢條件中的所有欄位需要從最左邊起按順序出現在多列象引中, 需要按照最左家引列查詢,不能跳過中間列, 查詢條件的欄位數要小於等於多列索引的欄位數, 中間欄位不能存在範圍查詢的欄位(s,like等), 這樣的sql語句可以使用該多列索引。

mysal多列索引適合的場景 1,匹配全值,對索引中的所有列都指定具體的值(例如: names='xxx' and phoneNo='xxx' andaddresse='xxx ) 2.匹配最左字首(例如: names='xxx,使用索引中的第一列) 3.匹配部分最左字首(例如: names='xx' and phoneNo='xx') 4.匹配第一列範圍查詢(可用like a%,但不能使用like %b或則 like %b%)

2,唯一索引 唯一索引它與前面的音通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。 如果是組合索引,則列值的組合必須唯一.

建立唯一索引 create unique index 索引名 on 表名 (列名) 修改表結構 alter table 表名 add unique index(列名) 建立表的時候直接指定 create table 表名( 列名  列的資料型別  列的約束,  unique index  索引名 (列名) ,

3.主鍵索引   特殊的唯一索引,不允許有空值   為表定義主鍵將自動建立主鍵索引

4,全文索引

全文搜尋中,mycql制定了最小字元長度,預設是4必須要匹配大於4的才會有返回結果,可以使用: SHOW VARIABLESLIKE'ft_min_word_len'來檢視制定的字元長度, 也可在mysql配置檔案my.ini更改最小字元長度, 方法是在my.ini增加一行  比如:ft_ini_word_len=2,改完後重啟mycql即可 另外mysql還會計算一個詞的權值,已決定是否出現在結果集中,mysql預設的閥值是50% mysql不支援中文的全文索引

MYISAM引擎     不支援事務和外來鍵     mycql中全文索引型別fullText只能用於MYISAM引擎的表     create table 表名(列名1,......,)engine=myisam 建立以mysiam為引擎的表只需在後面加上: engine = mysiam

INNODB     支援事務和外來鍵 顯示建立表時使用的資料庫引擎: show create table 表名

建立全文索引     1.create fulltext index 索引名 on 表名(列名)     2.alter table 表名 add fulltext 索引名(列名)     3.create table 表名(列名 列的資料型別 列的約束, fulltext 索引名(列名)

使用全文索引     match(列名列表)against(搜尋的值)

儲存過程(無參)

mycql儲存過程是一組為了完成特定功能的sql語句集

優點: 1.儲存過程能實現較快的執行速度 2.儲存過程可以重複使用,可減少資料庫開發人員的工作量 3.儲存過程可以用流程控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算 4.安全性高,可設定只有某些使用者才具有對制定儲存過程的使用權 5.儲存過程能減少網路流量

基本語法 如何建立儲存過程: create proecdure 儲存過程名稱([引數列表]) begin 過程體(sql程式碼); end;     例如顯示3+2結果的儲存過程: create proecdure pro_showNum() begin select 2+3 from dual; end; dual為偽表 查詢某個資料庫下的所有儲存過程: show procedure status where db=資料庫名稱 如何呼叫儲存過程: call 儲存過程名稱() 如何刪除儲存過程: drop procedure 儲存過程名稱

儲存過程中的變數

1、變數分類:     區域性變數     begin到end語句之間,用declare申明     宣告區域性變數: create proecdure 儲存過程名稱([引數列表]) begin declare 變數名 資料型別 [default 值]  過程體; end;             改變變數的值: create proecdure 儲存過程名稱([引數列表]) begin declare 變數名 資料型別 [default 值]  set 變數名=值||表示式; (set 變數名:=值||表示式) 過程體; end; 區域性變數只在begin  end之間有效

2、使用者變數    使用者自定義的變數     宣告使用者變數: set @變數名 := 值     使用select宣告變數值: select @變數名 := 變數值     查詢使用者變數: select @a from dual;     使用者變數全域性對指定使用者有用

3、會話變數 開啟客戶端連線到MySQL伺服器到關閉連線的過程叫會話,會話變數只對連線的客戶端有效

4、全域性變數     對所有客戶端生效,只有具有super許可權才可以設定全域性變數     select into         把選定的列值直接儲存到變數,只有單一的行可以被取回: select 列1,列2...... into 變數1,變數2...... from 表名 where 過濾條件 使用delimiter修改結束識別符號     一般我們修改結束識別符號為$符號,或者雙\\

      儲存過程(有參)

引數型別 1、in 輸入型別 create proecdure 儲存過程名稱(in 引數名 引數資料型別) begin 過程體; end;

2、out 輸出型別 定義的引數只能在過程體內部賦值,表示該引數可以將某個值傳遞迴呼叫他的過程(儲存過程內部,該引數初始值為null,無論呼叫者是否給儲存過程引數設定值) 可在儲存過程內部被改變並返回 create proecdure 儲存過程名稱(引數型別 引數名 引數資料型別,out 引數名 引數資料型別......) begin 過程體; end; 呼叫該儲存過程時要先在外部宣告一個使用者變數

3、inout輸入輸出引數 既是輸入引數又是輸出引數 create proecdure 儲存過程名稱(inout  引數名 引數資料型別) begin 過程體; end; 呼叫該儲存過程也需要先在外部宣告使用者變數

語法: create proecdure 儲存過程名稱(引數型別 引數名 引數資料型別,......) begin 過程體; end;

引數型別使用 僅將資料傳遞給mycql儲存過程,使用in引數型別 僅從mycql儲存過程返回值,使用out引數型別 需要把資料傳給mycql儲存過程,還要經過一些計算後再傳回給我們,此時要用inout mycql儲存過程引數如果不顯示制定引數型別,則預設為"in"

流程控制語句 1、if判斷語句 語法: if 條件表示式 then sql語句集  end if;

2、雙分支if if 條件表示式 then sql語句集  else sql語句集 end if;

3、多分支if if 條件表示式 then sql語句集  elseif 條件表示式 then sql語句集 else sql語句集 end if;

case判斷語句 語法: case 表示式 when 表示式值 then sql語句集; [when 表示式值 then sql語句集]...... [else sql語句集] end case;

語法2: case when 表示式 比較運算子 表示式值 then sql語句集; [when 表示式 比較運算子 表示式值 then sql語句集]...... [else sql語句集] end case;

在普通sql中使用: select 列明列表,case 值 when 比較值 then 結果 while語句          repaet語句 觸發器是與事件相關的特殊的儲存過程, 優點 1.自動 2.安全性 3.審計  跟蹤使用者對資料庫的操作 4.業務邏輯封裝性號,修改方便 5.實現複雜的資料

基本語法: create tigger 觸發器名稱 before/after insert/update/delete on 表名 for each row begin sql語句集 end 檢視觸發器語法: show tiggers 刪除觸發器:

old關鍵字與new關鍵字     old表示舊值     new表示新值