Mysql索引、視圖、存儲過程和函數、觸發器、存儲引擎(一)


Mysql高級,數據庫優化

1、知識點

一、索引

建立索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name(index_col_name,...)
查看索引
show index 1 from table_name;
刪除索引
DROP INDEX index_1 name ON tbl_name;

設計原則:mysql

  • 對查詢頻次較高,且數據量比較大的表創建索引。sql

  • 索引字段的選擇,最佳候選列應當從where子句的條件中提取數據庫

  • 使用惟一索引,區分度越高,使用索引的效率越高。編程

  • 索引能夠有效的提高查詢數據的效率,但索引數量不是多多益善,索引越多會引入至關高的維護代價,下降DML操做的效率,增長相應操做的時間消耗。安全

  • 使用短索引,索引建立以後也是使用硬盤來存儲的,所以提高索引訪問的I/O效率,也能夠提高整體的訪問效率。服務器

  • 利用最左前綴,N個列組合而成的組合索引,那麼至關因而建立了N個索引,若是查詢時where子句中使用了組成該索引的前幾個字段,那麼這條查詢SQL能夠利用組合索引來提高查詢效率。併發

    建立複合索引: CREATE INDEX idx_name_email_status ON tb_seller(NAME,email,STATUS); 就至關於 對name 建立索引 ; 對name , email 建立了索引 ; 對name , email, status 建立了索引 ;ide

二、視圖

建立視圖
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
查看視圖
show views;
刪除視圖
DROP VIEW view_name ;

視圖相對於普通的表的優點主要包括如下幾項。 **簡單:**使用視圖的用戶徹底不須要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來講已是過濾 好的複合條件的結果集。 **安全:**使用視圖的用戶只能訪問他們被容許查詢的結果集,對錶的權限管理並不能限制到某個行某個列,但 是經過視圖就能夠簡單的實現。 **數據獨立:**一旦視圖的結構肯定了,能夠屏蔽表結構變化對用戶的影響,源表增長列對視圖沒有影響;源表 修改列名,則能夠經過修改視圖來解決,不會形成對訪問者的影響。函數

三、存儲過程和函數

存儲過程和函數是 事先通過編譯並存儲在數據庫中的一段 SQL 語句的集合,調用存儲過程和函數能夠簡化應用開發人員的不少工做,減小數據在數據庫和應用服務器之間的傳輸,對於提升數據處理的效率是有好處的。 存儲過程和函數的區別在於函數必須有返回值,而存儲過程沒有。oop

3.1存儲過程

建立存儲過程
CREATE PROCEDURE procedure_name ([proc_parameter[,...]])
begin
-- SQL語句
end ;
調用存儲過程
call procedure_name() ;
刪除存儲過程
DROP PROCEDURE [1 IF EXISTS] sp_name ;

存儲過程是能夠編程的,意味着可使用變量,表達式,控制結構 , 來完成比較複雜的功能。

知識小貼士 DELIMITER 該關鍵字用來聲明SQL語句的分隔符 , 告訴 MySQL 解釋器,該段命令是否已經結束了,mysql是否能夠執行了。默認狀況下,delimiter是分號;。在命令行客戶端中,若是有一行命令以分號結束,那麼回車後,mysql將會執行該命令。

例子1:
DELIMITER $
CREATE PROCEDURE pro_test5()
BEGIN
declare countnum int;//聲明countnum是一個int類型
select count(*) into countnum from city;//複製,也可以使用set countnum=10;
select countnum;
END$
DELIMITER ;


例子2(if條件):
根據定義的身高變量,斷定當前身高的所屬的身材類型
180 及以上 ----------> 身材高挑
170 - 180 ---------> 標準身材
170 如下 ----------> 通常身材
//in輸入out輸出

delimiter $
create procedure pro_test5(in height int , out description varchar(100))
begin
if height >= 180 then
set description='身材高挑';
elseif height >= 170 and height < 180 then
set description='標準身材';
else
set description='通常身材';
end if;
end$
delimiter ;

//調用
call pro_test5(168, @description)$
select @description$


例子3(case條件)
給定一個月份, 而後計算出所在的季度
delimiter $
create procedure pro_test9(month int)
begin
declare result varchar(20);
case
when month >= 1 and month <=3 then
set result = '第一季度';
when month >= 4 and month <=6 then
set result = '第二季度';
when month >= 7 and month <=9 then
set result = '第三季度';
when month >= 10 and month <=12 then
set result = '第四季度';
end case;
select concat('您輸入的月份爲 :', month , ' , 該月份爲 : ' , result) as content ;
end$
delimiter ;

知識小貼士 @description : 這種變量要在變量名稱前面加上「@」符號,叫作用戶會話變量,表明整個會話過程他都是有做用的,這個相似於全局變量同樣。 @@global.sort_buffer_size : 這種在變量前加上 "@@" 符號, 叫作 系統變量

三種循環
題目:計算從1加到n的值

例子1(while)
---------------------------------------
while search_condition do
statement_list
end while;
---------------------------------------
delimiter $
create procedure pro_test8(n int)
begin
declare total int default 0;
declare num int default 1;
while num<=n do
set total = total + num;
set num = num + 1;
end while;
select total;
end$
delimiter ;


例子2(repeat)
語法結構
---------------------------------------
REPEAT
statement_list
UNTIL search_condition
END REPEAT;
----------------------------------------
delimiter $
create procedure pro_test10(n int)
begin
declare total int default 0;
repeat
set total = total + n;
set n = n - 1;
until n=0
end repeat;
select total ;
end$
delimiter ;


例子3(loop)
---------------------------------------
[begin_label:] LOOP
statement_list
END LOOP [end_label]
----------------------------------------
退出循環的條件須要使用其餘的語句定義,一般可使用 LEAVE 語句實現,leave用來從標註的流程構造中退出,一般和 BEGIN ... END 或者循環一塊兒使用。下面是一個使用 LOOP 和 LEAVE 的簡單例子 , 退出循環:

delimiter $
CREATE PROCEDURE pro_test11(n int)
BEGIN
declare total int default 0;
ins: LOOP
IF n <= 0 then
leave ins;
END IF;
set total = total + n;
set n = n - 1;
END LOOP ins;
select total;
END$
delimiter ;

3.2存儲函數

語法結構
CREATE FUNCTION function_name([param type ... ])
RETURNS type
BEGIN
...
END;

例子:
定義一個存儲過程, 請求知足條件的總記錄數 ;
delimiter $
create function count_city(countryId int)
returns int
begin
declare cnum int ;
select count(*) into cnum from city where country_id = countryId;
return cnum;
end$
delimiter ;

調用:
select count_city(1);
select count_city(2);

4.觸發器

觸發器是與表有關的數據庫對象,指在 insert/update/delete 以前或以後,觸發並執行觸發器中定義的SQL語句集 合。觸發器的這種特性能夠協助應用在數據庫端確保數據的完整性 , 日誌記錄 , 數據校驗等操做 。

使用別名 OLD 和 NEW 來引用觸發器中發生變化的記錄內容,這與其餘的數據庫是類似的。如今觸發器還只支持 行級觸發,不支持語句級觸發。

語法結構
create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ] -- 行級觸發器
begin
trigger_stmt ;
end;


例子1:
DELIMITER $
create trigger emp_logs_delete_trigger
after delete
on table_name1
for each row
begin
insert into table_name2 (...)
values(...);
end $
DELIMITER ;

2、存儲引擎

一、 最經常使用的存儲引擎

建立新表時若是不指定存儲引擎,那麼系統就會使用默認的存儲引擎,MySQL5.5以前的默認存儲引擎是 MyISAM,5.5以後就改成了InnoDB。另外兩種 MEMORY、MERGE , 瞭解便可。

1.1 InnoDB

是Mysql的默認存儲引擎,用於事務處理應用程序,支持外鍵。若是應用對事務的完整性有比較高的要求,在併發條件下要求數據的一致性,數據操做除了插入和查詢以外,還包含不少的更新、刪除操做,那麼InnoDB存儲引擎是比較合適的選擇。InnoDB存儲引擎除了有效的下降因爲刪除和更新致使的鎖定, 還能夠確保事務的完整提交和回滾,對於相似於計費系統或者財務系統等對數據準確性要求比較高的系統,InnoDB是最合適的選擇。

具備事務控制
start transaction;
insert into goods_innodb(id,name)values(null,'Meta20');
commit;

1.2MyISAM

MyISAM : 若是應用是以讀操做和插入操做爲主,只有不多的更新和刪除操做,而且對事務的完整性、併發 性要求不是很高,那麼選擇這個存儲引擎是很是合適的。

相關文章
相關標籤/搜索