本部分是mysql的相關特性介紹。
一、mysql儲存引擎簡介
儲存引擎是通過採用不同的技術將資料儲存在檔案或記憶體中,不同的技術有不同的儲存機制,其功能和能力也不同,通過選擇不同的技術,可以獲得特殊的速度或功能,從而提高應用的效能。儲存引擎是mysql特有的
在不同的業務場景下選擇不同的儲存引擎,這樣能夠發揮mysql的最佳效能。
1、mysql儲存引擎的分類
分類如下圖
常用的儲存引擎
myisam:節省資料庫空間,當資料讀遠大於修改時,可以使用該儲存引擎
innodb:支援事務,如果資料修改較多時,可以使用該儲存引擎
memory:儲存在記憶體中,速度快,如果儲存非永久性資料時,可以使用該儲存引擎
儲存引擎常用指令:
(1)檢視mysql的儲存引擎:show engines;
(2)在建立表的時候,可以使用engine指定儲存引擎:如果沒有指定儲存引擎,則使用當前預設的儲存引擎。
create table table_name( no int )engine = myisam;
(3)可以修改表的儲存引擎,使用如下命令修改:alter table 表名 engine = 儲存引擎名稱;
(4)檢視表使用的儲存引擎:show create table emp;
二、mysql的事務transaction
1、概念:事務可以保證多個操作原子性,對於資料庫來說,事務可以保證批量的dml要麼全成功,要麼全失敗。通常乙個事務對應乙個完整的業務
2、事務的執行:
update t_bank set money=500 where account=1001;
update t_bank set money=2500 where account=1002;
如果上面的sql語句第一條執行成功了,但是由於某些原因第二條sql語句執行失敗了,此時賬戶1001上的金額變成了500,而賬戶1002上的金額是2000,這樣就不正確了。
為了能夠正常的執行業務,上面兩條sql語句要麼全部執行成功,要麼全部執行失敗,因為他們是最小的業務單元,不能再進行拆分了。
當第一條sql語句執行結束後,並不會立即修改資料庫表中的資料,而是在記憶體中記錄一下,第二條sql語句執行成功後,才會修改資料庫表中的資料,如果第二條sql語句執行失敗了,則將清空記憶體中的記錄,此時並不會修改資料庫表中的資料,要實現這樣的功能,就必須使用事務來完成。
3、事務具有四個特徵acid
原子性(atomicity),事務是最小單元,不可再分;
一致性(consistency),事務要求所有的dml語句操作的時候,必須保證同時成功或同時失敗;
隔離性(isolation),乙個事務不會影響其他事務的執行;
永續性(durability),在事務完成之後,該事務對資料庫所作的更改將持久地儲存在資料庫中,並不會被回滾;
4、mysql事務的提交和回滾
mysql中預設情況下,事務是自動提交的,當執行一條dml(增刪改資料庫表資料)語句時,就開啟並且自動提交了事務。可以通過下面的語句檢視事務是否是自動提交的:show variables like '%commit%';
自動提交事務代表該事務已經對資料庫進行對應操作
手動提交後的事務提交和回滾
如果想要關閉mysql事務的自動提交,可以使用下面語句手動開啟事務:start transaction;關閉自動提交後,進行的dml語句都不會對資料庫進行操作,先在記憶體中進行操作。
所以關閉自動提交後可以使用rollback; 語句進行事務回滾,清空該事務在記憶體的記錄,資料回滾上乙個狀態值。回滾只能回滾在記憶體的操作,無法回滾在資料庫的操作
手動開啟事務只有當使用commit;語句提交事務後,事務提交到了資料庫進行操作,才會改變資料庫的值,此時無法進行回滾,rollback失效,因為事務已經對資料庫操作了,無法回滾。
5、事務的隔離級別,檢視當前會話的隔離級別命令:select @@tx_isolation;
read uncommitted 讀未提交
事務a和事務b,事務a未提交的資料,事務b可以讀取,這裡讀取到的資料叫做「髒資料」,該級別最低,一般只是理論上存在,資料庫的預設隔離級別都高於該級別。
read committed 讀已提交
事務a和事務b,事務a提交的資料,事務b才可讀取到,換句話說:對方事務提交之後的資料,當前事務才可讀取到,可以避免讀取「髒資料」,但是改級別會有「不可重複讀」的問題,事務b讀取一條資料,當事務a修改這條資料並提交後,事務b再讀取這條資料時,資料發生了變化,即事務b每次讀取的資料有可能不一致,這種情況叫做「不可重複讀」。
repeatable read 重複讀
mysql預設的隔離級別是重複讀,該級別可以達到「重複讀」的效果,但是會有「幻讀」的問題,即事務a讀取資料,此時事務b修改了這條資料,但是事務a讀取的還是之前的舊資料的內容,這樣就出現了幻讀。
serializable 序列化
事務a和事務b,事務a在運算元據庫表中資料的時候,事務b只能排隊等待,這樣保證了同乙個時間點上只有乙個事務運算元據庫,該級別可以解決「幻讀」的問題。但是這種級別一般很少使用,因為吞吐量太低,使用者體驗不好。
6、髒讀、不可重複讀和幻讀的區別
髒讀:髒讀又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。
不可重複讀:同時操作,事務一分別讀取事務二操作時和提交後的資料,讀取的記錄內容不一致。不可重複讀是指在同乙個事務內不同時間的兩次查詢,兩個相同的查詢返回了不同的結果。
幻讀:和不可重複讀類似,但是事務二的資料操作僅僅是插入和刪除,不是修改資料,讀取的記錄數量前後不一致,導致出現幻覺的現象。
不可重複讀和幻讀的區別是前者由於事務對資料進行update導致查詢出不同資料不一致;後者由於事務對資料進行insert或者delect,導致原來查詢存在的資料像幻覺一樣變多或者變少了。
三、mysql索引
1、索引的作用
索引相當於一本字典目錄,能夠提高資料庫的查詢效率,表中每乙個欄位都可新增索引。主鍵會自動新增索引,在查詢時,如果能通過主鍵查詢的盡量使用主鍵查詢,效率高。
2、mysql資料庫表中的檢索方式有兩種:
全表掃瞄(效率低)
例如:select * from emp where ename = 『king';如果ename欄位沒有新增索引的話,就會發生全表掃瞄。
通過索引檢索
3、新增索引的情況:
該欄位資料量龐大;
該欄位很少的dml操作(由於索引也需要維護,dml操作多的話,也影響檢索效率);
該欄位經常出現在where條件中;
注意:實際開發中會根據專案需求等綜合因素來做調整,新增索引並不能保證一定能夠提公升檢索效率,索引新增不當也有可能會導致效率降低。
4、使用索引
建立索引
語法:create index 索引名 on 表名(列名);
create index dept_dname_index on dept(dname);
檢視索引
語法:show index from 表名;
show index from dept;
刪除索引
語法:drop index 索引名 on 表名;
drop index dept_dname_index on dept;
四、mysql檢視
1、檢視其實就是乙個查詢結果,檢視的作用可以隱藏表的實現細節。
2、使用檢視
建立檢視
語法:create view 檢視名稱 as 查詢語句;
示例,將emp表中的empno、ename、sal作為檢視展示:
create view e_infoas select empno,ename,sal from emp;
修改檢視
語法:alter view 檢視名稱 as 查詢語句
示例:alter view e_info as select ename,job from emp;
刪除檢視
語法:drop view if exists 檢視名稱;
示例:drop view if exists e_info;
3、資料庫的匯出和匯入
mysqldump -u root -p monkey1024 > d:/init.sql
匯入sql指令碼,在命令提示符(管理員許可權)下登入成功後,輸入下面內容:
source d:/init.sql
即source後寫上sql檔案的目錄位址。
mysql控制代碼 MySQL與控制代碼 MySQL
bitscn.com 1.環境 os win 2003 server x86 db mysql 5.1.30 community log 2.問題 mysql server占用的控制代碼數過大,使用過程消費控制代碼速度比釋放速度來的快,部分其他應用申請不到控制代碼,導致不可用。2.1.handle ...
mysql教程 mysql事務與mysql儲存引擎
事務概念及儲存引擎 1.0為何要事務?先來看乙個場景,銀行轉賬匯款 李彥巨集和周鴻?天天打架,現在讓李彥巨集給周鴻?轉款1000元 設計如下表 account表 編號 id 使用者名稱 user 金額 cash 1 李彥巨集 3000 2 周鴻?2000 傳統的做法 mysql update acc...
Mysql命令mysql 連線Mysql資料庫
mysql命令格式 mysql h主機位址 u使用者名稱 p使用者密碼 1 連線到本機上的mysql 首先開啟dos視窗,然後進入目錄mysql bin,再鍵入命令mysql u root p,回車後提示你輸密碼。注意使用者名稱前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新輸入密碼...