1. 程式人生 > 其它 >mysql索引,事務,檢視,儲存過程,儲存引擎

mysql索引,事務,檢視,儲存過程,儲存引擎

mysql索引,事務,檢視,儲存過程,儲存引擎

一,索引

1.概念

索引:
提供指向儲存在表的指定列中的資料值的指標,然後根據指定的排序順序對這些指標排序。資料庫使用索引以找到特定值,然後順指標找到包含該值的行。

索引就類似於書的目錄,根據目錄來快速查詢所需的內容資訊;

使用索引後,無需掃描全表來定位某行資料,而是通過索引表找到該行資料對應的實體地址來訪問相應的資料,加快查詢速度;

建立索引的目的就是加快對錶中記錄的查詢和排序。

2.作用

設定了合適的索引之後,資料庫利用各種快速的定位技術,能夠大大加快查詢速率;

特別是當表很大時,或者查詢涉及到多個表時,使用索引可使查詢加快成幹倍;

可以降低資料庫的IO成本,並且索引還可以降低資料庫的排序成本;

通過建立唯一性索引保證資料表資料的唯一性;

可以加快表與表之間的連線;

在使用分組和排序時,可大大減少分組和排序時間;

3.建立索引原則

表的主鍵、外來鍵必須有索引,因為主鍵的唯一性,外表關聯的是子表的主鍵,可以快速定位;

資料量超過300行的表應該有索引,若無索引,需要把表遍歷查詢,嚴重影響效能;

唯一性太差的欄位不適合建立索引;

更新太頻繁地欄位不適合建立索引;

經常與其他表進行連線的表,在連線欄位上應該建立索引;

經常出現在 Where子句中的欄位,特別是大表的欄位,應該建立索引;

索引應該建在選擇性高的欄位上;

索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引;

如果必須需要建立索引,則建立FULLTEXT (全文索引)

4.索引優缺點

優點:
加快資料的檢索速度;
加速表和表之間的連線;
建立唯一性索引,保證資料庫表中每一行資料的唯一性;
在使用分組和排序子句進行資料檢索時,減少查詢中分組和排序的時間;

缺點:
索引需要佔物理空間;
當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。

5.索引的分類

1.普通索引

最基本的索引型別,沒有唯一性之類的限制

1)直接建立索引
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
(列名(length)):length是可選項,如果忽略 length 的值,則使用整個列的值作為索引。如果指定使用列前的length個字元來建立索引,這樣有利於減小索引檔案的大小。
【索引名建議以“_index”結尾。】

2)修改表方式建立
ALTER TABLE 表名 ADD INDEX 索引名 (列名);

3)建立表的時候指定索引
CREATE TABLE 表名 ( 欄位1 資料型別,欄位2 資料型別[,...],INDEX 索引名 (列名));

2.唯一性索引

索引列的所有值都只能出現一次,必須唯一;
唯一索引允許為空,僅允許為空一次;
新增唯一鍵將自動建立唯一索引。

1)直接建立唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名);

2)修改表方式建立
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

3)建立表的時候指定
CREATE TABLE 表名 (欄位1 資料型別,欄位2 資料型別[,...],UNIQUE 索引名 (列名));


3.主鍵索引

主鍵是一種唯一性索引,但必須指定為PRIMARY KEY;
主鍵索引具備唯一索引除允許為空外的特性;
新增主鍵將自動建立主鍵索引。

1)建立表的時候指定
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

2)修改表方式建立
ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

4.組合索引(單列&多列)

可以是單列上建立的索引,也可以是在多列上建立的索引,通過多列索引可以確保定位到某個實體;
需要滿足最左原則,因為 select 語句的 where 條件是依次從左往右執行的,所以在使用 select 語句查詢時 where 條件使用的欄位順序必須和組合索引中的排序一致,否則索引將不會生效。

CREATE TABLE 表名 (列名1 資料型別,列名2 資料型別,列名3 資料型別,INDEX 索引名 (列名1,列名2,列名3));

5.全文索引(FULLTEXT)

適合在進行模糊查詢的時候使用,可用於在一篇文章中檢索文字資訊;
在 MySQL5.6 版本以前FULLTEXT 索引僅可用於 MyISAM 引擎;
在 5.6 版本之後 innodb 引擎也支援 FULLTEXT 索引;
全文索引可以在 CHAR、VARCHAR 或者 TEXT 型別的列上建立。每個表只允許有一個全文索引。

1)直接建立索引
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

2)修改表方式建立
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

3)建立表的時候指定索引
CREATE TABLE 表名 (欄位1 資料型別[,...],FULLTEXT 索引名 (列名));
#資料型別可以為 CHAR、VARCHAR 或者 TEXT

4)使用全文索引查詢
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查詢內容');

6.查詢索引的兩種方式

show index from (表名);

show keys from (表名);

二,mysql事務

1.事務的概念及ACID特點

1)概念:

1.事務是一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫命令要麼都執行,要麼都不執行;
2.事務是一個不可分割的工作邏輯單元,在資料庫系統上執行併發操作時,事務是最小的控制單元;
3.適用於多使用者同時操作的資料庫系統的場景,如銀行、保險公司及證券交易系統;
4.通過事務的整體性以保證資料的一致性;
回滾:如果事務成功了一部分,一部分未成功,則執行回滾,回到事務的起點,重新開始操作。

2)事務的ACID特點

1)原子性 (Atomictity)
事務是一個完整的操作,事務的各元素是不可分的;
事務中的所有元素必須作為一個整體提交或回滾;
如果事務中的任何元素失敗,則整個事務將失敗。

2)一致性 (Consistency)
當事務完成時,資料必須處於一致狀態:在事務開始之前,資料庫中儲存的資料處於一致狀態;
在正在進行的事務中,資料可能處於不一致的狀態;當事務成功完成時,資料必須在此回到已知的一致狀態。

3)隔離性 (Isolation)
對資料進行修改的所有併發事務時彼此隔離的,這表名事務必須是獨立的,它不應以任何方式依賴於或影響其他事務;
修改資料的事務可以在另一個使用相同資料的事務開始之前訪問這些資料,或者在另一個使用相同資料的事務結束之後訪問這些資料。

4)永續性 (Durability)
事務永續性指不管系統是否發生故障,事務處理的結果都是永久的;
一旦事務被提交,事務的效果會被永久的保留在資料庫中。

2.事務隔離級別

髒讀(一個事務讀取到另一個事務未提交的資料)
不可重複讀(一個事務讀取到另一個事務已經提交的資料)
幻讀(一個事務多次查詢整表資料,由於其他事務新增(刪除)記錄造成多次查詢的記錄條數不同(一個事務讀取到另一個事務已經提交的資料))

read uncommitted : 讀取尚未提交的資料 :不解決髒讀
read committed:讀取已經提交的資料 :可以解決髒讀
repeatable read:重讀讀取:可以解決髒讀和不可重複讀
serializable:序列化:可以解決髒讀、不可重複讀和虛讀—相當於鎖表
Mysql預設的事務處理級別是 repeatable read ,而Oracle和SQL Server是read committed

1)查詢全域性事務隔離級別

show global variables like '%isolation%';

select @@global.tx_isolation;

2)查詢會話事務隔離級別

show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

3)設定全域性事務隔離級別

set global transaction isolation level read committed;
show global variables like '%isolation%';

4)設定會話事務隔離級別

set session transaction isolation level read committed;
show session variables like '%isolation%';

3.事務控制語句

begin;               開啟事務
commit;              提交事務,使已對資料庫進行的所有修改變為永久性的
rollback;            回滾事務,撤銷正在進行的所有未提交的修改
savepoint s1;        建立回滾點,s1為回滾點名稱,一個事務中可以有多個
rollback to s1;      回滾到s1回滾點

1)建立表+測試提交事務

begin;
update info set money=money - 200 where name='A';
commit;
quit

再次登入:
select * from info;

2)測試回滾事務

begin;
update info set money=money + 200 where name='A';
select * from info;
rollback;
select * from info;

3)測試多點回滾

begin;
update info set money=money+200 where name='B';
select * from info;
savepoint s1;
update info set money=money+200 where name='A';
select * from info;
savepoint s2;
insert into info values (3,'C','1500');
select * from info;
rollback to s2;
select * from info;


4.set 設定控制事務

SET AUTOCOMMIT=0;			#禁止自動提交
SET AUTOCOMMIT=1;			#開啟自動提交,Mysql預設為1
SHOW VARIABLES LIKE 'AUTOCOMMIT';	#檢視Mysql中的AUTOCOMMIT值

如果沒有開啟自動提交,當前會話連線的mysql的所有操作都會當成一個事務直到你輸入rollback|commit;當前事務才算結束。當前事務結束前新的mysql連線時無法讀取到任何當前會話的操作結果。
如果開起了自動提交,mysql會把每個sql語句當成一個事務,然後自動的commit。
當然無論開啟與否,begin; commit|rollback; 都是獨立的事務。

使用rollback只能向前回滾,無法向後;
使用commit提交後,事務結束,此時再次使用的rollback屬於另一個新的事務;

三,檢視

1.概念

檢視是一張虛擬的表,資料不存在試圖中,真實表的對映資料;
利用,條件篩選,分組,排序等產生出一個結果集。並且做成持久化儲存。(並不儲存資料,只儲存對映,儲存於記憶體中);
檢視佔用資源相對記憶體小,真實表中資料變化,檢視會對應變化。
建立檢視、多表相連查詢:
命令格式:
建立檢視
create view <檢視名稱>;
create view info_view as select id,name,age from info 條件;
(多表相連的條件是on、單表的條件是where)
查詢檢視
select * fom info_view;
select name,age from info_view;

2.特點

安全性高;
簡化sql操作;
可以針對不同使用者建立不同的檢視,不同許可權的使用者瀏覽不同的資訊

四,儲存過程

1.概念

概念
儲存過程:多用於軟體開發;
儲存過程是防止程式碼在網路傳輸過程中被截獲,做了安全性保障;
原始狀態:在程式碼過程中需要嵌入sql語句,通過連線驅動把sql語句作為引數,傳遞給mysql(資料庫)進行執行,此時就會有安全風險

通過儲存過程解決安全隱患;
儲存過程是寫在資料庫中,並不是程式中;
程式是通過呼叫儲存過程名稱去觸發操作。

2.優點

程式碼量優化,傳輸安全,網路資源優化

五,儲存引擎

1.儲存引擎

MySQL中的資料用各種不同的技術儲存在檔案中,每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱為儲存引擎;
儲存引擎就是MySQL將資料儲存在檔案系統中的儲存方式或儲存格式
目前MySQL常用的兩種儲存引擎:
MylSAM
InnoDB
MySQL儲存引擎是MySQL資料庫伺服器中的元件,負責資料庫執行世紀的資料I/O操作

MyISAM 和 INNODB區別
1),儲存結構
MyISAM:每個MyISAM在磁碟上儲存成三個檔案;
InnoDB:所有的表都儲存在同一個資料檔案中

2),儲存空間
MyISAM:可被壓縮,儲存空間較小。支援三種不同的儲存格式:靜態表(預設,但是注意資料末尾不能有空格,會被去掉)、動態表、壓縮表。
InnoDB:需要更多的記憶體和儲存,它會在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。

3),可移植性、備份及恢復
MyISAM:資料是以檔案的形式儲存,所以在跨平臺的資料轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作。
InnoDB:免費的方案可以是拷貝資料檔案、備份 binlog,或者用 mysqldump,在資料量達到幾十G的時候就相對痛苦了。

4), 事務支援
MyISAM:強調的是效能,每次查詢具有原子性,其執行數度比InnoDB型別更快,但是不提供事務支援。
InnoDB:提供事務支援事務,外部鍵等高階資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力

5),表鎖差異
MyISAM:只支援表級鎖;
InnoDB:支援事務和行級鎖,是innodb的最大特色

6),全文索引
MyISAM:支援 FULLTEXT型別的全文索引
InnoDB:不支援FULLTEXT型別的全文索引,但是innodb可以使用sphinx外掛支援全文索引,並且效果更好。

7),表主鍵
MyISAM:允許沒有任何索引和主鍵的表存在,索引都是儲存行的地址。
InnoDB:如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵(使用者不可見),資料是主索引的一部分,附加索引儲存的是主索引的值。

8),表的具體行數
MyISAM:儲存有表的總行數,如果select count(*) from table;會直接取出出該值。
InnoDB:沒有儲存表的總行數,如果使用select count(*) from table;就會遍歷整個表,消耗相當大,但是在加了wehre條件後,myisam和innodb處理的方式都一樣。

9), 外來鍵
MyISAM:不支援
InnoDB:支援

10),自增長 AUTO_INCREMENT
MyISAM:可以和其他欄位一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列;
InnoDB:InnoDB中必須包含只有該欄位的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。