mysql常識以及存儲引擎,鎖和事務

常見的數據庫系統:

1、甲骨文的Oracle

2IBMDB2

3、微軟的Access SQL Server

4、開源PostgreSQL

5、開源MySQL 


mysql數據庫三階段

初期開源數據庫階段

sun mysql階段

oracle mysql階段


OLTP:聯機事務處理,面向基本的、日常的事務處理。

OLAP:聯機分析處理,數據倉庫的主要應用。

mysql分支版本(一些):

MariaDB : Maria引擎室myisam存儲引擎的升級版本,增加了對Hash join的支持和Semi Join的優化,提高了查詢性能,適合OLAP。

Drizzle:適合雲計算組件和web應用的數據庫,高併發,高效的內存使用,開放源碼。

InnoSQL:1、InnoDB Flash Cache:將SSD作爲Flash Cache  2、InnoDB Share Memory :將Share Memory作爲InnoDB的共享內存,以此提高數據庫的預熱。3、IO Statistics:擴展了mysql原有的Slow log 的內容,現在可記錄某SQL語句的邏輯讀取和物理讀取的IO


存儲引擎(表類型):

InnoDB存儲引擎:支持事務、回滾,主要面向OLTP,支持行鎖設計、支持外鍵、支持類似Oracle的非鎖定讀。(mysql 5.5.8開始是默認存儲引擎)數據放在一個獨立的表空間、使用MVCC(多版本併發控制)、實現4種隔離級別,默認REPEATABLE級別、使用netx-key locking避免幻讀,還有插入緩衝、二次寫、自適應哈希索引、預讀等。採用聚集的方式,每張表都按主鍵的順序進行存儲。索引和數據是緊密捆綁的,沒有使用壓縮從而會造成INNODB比MYISAM體積龐大不小。

 使用場合:在承載的大部分項目執行insert 和update的話,應該選擇InnoDB.

優勢:在於提供了良好的事務管理、崩潰、修復能力和併發控制,

缺點:是其讀寫效率稍差,佔用的數據空間相對比較大.


Myisam存儲引擎:不支持事務,表鎖設計,支持全文索引,主要面向OLAP,在innodb以前是默認存儲引擎,它的緩衝池只緩存索引文件,而不緩存數據文件。索引和數據分開的,可以加載更多的索引,並且索引是壓縮的,相對內存來說使用效率就提高不少,他使用一種表格鎖定的機制,來優化多個併發讀寫操作。MYISAM強調了快速讀取操作。

 使用場合:在承載的大部分項目是讀多寫少的項目平臺中,而MyISAM的讀性能是比Innodb強不少的

優點:佔用空間小,處理速度快,

缺點: 不支持事務日誌的完整性和併發性


NDB存儲引擎:集羣存儲引擎,類似於Oracle的RAC集羣(share everything),其結構是share nothing集羣結構。數據全部放在內存中,因此主鍵查找的速度極快,並能在線添加NDB存儲數據節點,面向OLTP。貌似mysql集羣企業應用不多,因爲技術和穩定性都不太成熟。


Memory存儲引擎:數據全部放在內存,數據庫重啓或崩潰,表中數據消失,適合存儲OLTP應用臨時表,也可以作爲OLAP數據庫應用的數據倉庫的維度表,默認使用hash索引而不是B+索引。

優點:存儲速度快

缺點:缺乏穩定性和完整性


Infobright存儲引擎:第三方存儲引擎,存儲按照列而非行的,故適合OLAP的數據庫應用

merge(mrg_myisam)存儲引擎:一組myisam表的組合, 這些myisam表必須結構完全相同,使用merge表來透明地對多個表進行查詢和更新操作

NTSE存儲引擎:網易開發面向內部使用的,目前不支持壓縮、行級緩存等特性。

BDB: 源自Berkeley DB,事務型表的另一種選擇

archive: 非常適合存儲大量獨立的、作爲歷史記錄的數據, 它們不經常被讀取, archive擁有高效的插入速度,但對查詢的支持相對較差

CSV: 邏輯上由逗號分割數據的存儲引擎

BlackHole: 黑洞引擎,寫入的任何數據都會消失,一般用於記錄binlog, 做複製的中繼。


mysql下查看存儲引擎:

(1)、查詢Mysql支持的引擎

Mysql->show engines;

Mysql->show engines\G;    +G和不加G兩種不同的顯示方式。

(2)、查詢Mysql支持引擎的信息

Mysql->show variables like ‘have%’

(3)、查詢Mysql默認存儲引擎

Mysql-> show variables like'storage_engine';

 如果想修改存儲引擎,可以在my.ini中進行修改

Default-storage-engine=引擎類型

修改表的存儲引擎:

alter table t1 engine = innodb;


事務:

transaction(事務):

所謂事務是用戶定義的一個操作序列, 這些操作要麼全做要麼全不做, 是一個不可分割的工作單位

在MySQL中, 事務可以是一條sql語句、一組sql語句或是整個程序

只有innodb、bdb存儲引擎支持事務

show engines\G

事務的4個特性(ACID)

Note: 注意engine

原子性(Atomicity):

原子意爲最小的粒子, 或者說不能再分的事物, 組成事務的所有語句要麼全部執行, 要麼全部取消

一致性(Consistency):

指數據在同一個事務中, 前後應保持一致

s1讀數據, s2也訪問同一數據, 且修改了它, s1再讀, 得到的數據與剛纔不一樣了, 這就違反了一致性

(s1在事務中)

隔離性(Isolation):

commit前, 某個事務的操作對其他session不可見

持久性(Durability):

當事務完成後, 其影響應該保留下來, 不能撤消

事務工作原理

若dml不在事務中, s1改了, s2馬上就可以看到

若dml在事務中, commit前dml並沒有作用到表, 而是記錄在事務日誌文件中

所以其他session看不到結果

commit時, 就將記錄在事務日誌f文件中的dml作用到表

當執行了commit或rollback後, 這個事務就結束了


鎖的介紹:

計算機協調多個進程或線程併發訪問某一資源的機制

除cpu/mem/hd外, 數據(或表、一行記錄)也是一種供多用戶共享、爭用的資源

MySQL提供了多用戶併發訪問數據的能力,不同的dbms均提供了併發控制功能, 不同的開發工具往往也提供了實現數據庫併發控制的命令

mysql常見的三種鎖級別——表級鎖、頁面鎖、行級鎖;其中表級鎖有兩種模式——表共享讀鎖和表獨佔寫鎖。

MyISAM:
表級鎖。對myisam表進行讀操作的時候,它不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫操作;
對myisam表進行寫操作的時候,它會阻塞其他用戶對同一表的讀、寫請求.

innodb
提供行鎖(locking on row level),另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表.

行級鎖的優點如下:
1
)當很多連接分別進行不同的查詢時減小LOCK狀態。
2)如果出現異常,可以減少數據的丟失。因爲一次可以只回滾一行或者幾行少量的數據。

行級鎖的缺點如下:

1)比頁級鎖和表級鎖要佔用更多的內存。

2)進行查詢時比頁級鎖和表級鎖需要的I/O要多,所以我們經常把行級鎖用在寫操作而不是讀操作。

3)容易出現死鎖。

注意:Innodb不能確定操作的行,這個時候就使用的意向鎖,也就是表鎖

手動加鎖

lock tables emp read|write;

unlock tables;或quit均會釋放鎖

flush tables with read lock; -- 所有表加讀鎖



圖形化SQL查詢分析器:

MYSQL Workbench

Toad for Mysql

Imysql-Front

其他相應工具:phpMyAdmin,navicat for mysqlmysqlQueryBrowser。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章