mysql存儲引擎,事務

 

插件式存儲引擎mysql

客戶端請求連接線程進行處理,先查看數據庫的緩存,若緩存有直接返回,沒有經過分析器,優化器 ,在存儲引擎中查詢數據,返回,sql

如圖 c端是客戶端,經過相應連接器連接數據庫數據庫

s端是服務器端,mysql是有單進程多線程進程管理的緩存

  鏈接池:負責連接,認證,控制等安全

  鏈接池下面是mysql的主體服務器

    Sql  interface:sql接口session

    Paraser: 語法分析多線程

    Optimizer:優化器來優化併發

    caches: 緩存器函數

  Piuggable  storage  engines: 插件式存儲引擎,負責這麼存儲數據經常使用的5.0以前是myisam

5.0以後是innodb

  最後將數據轉存在磁盤上的文件,有日誌文件(錯誤日誌,二進制日誌,慢查詢日誌)和數據(數據,索引)文件

插件式存儲引擎:innodb是功能最完善的引擎了

>SHOW ENGINES;   查看所支持引擎

S>HOW   table   status     where   Engine=’InnoDB ’;     顯示錶狀態信息

Innodb   的延伸版  xtradb

Myisam   --------------  aria  myisam多用於讀多寫少的場景

InnoDB:InnoBase存儲引擎

數據存儲於「表空間(table space)"中:

 (1) 全部數據庫中的全部類型爲InnoDB的表的數據和索引存儲於同一個表空間中;

 表空間文件:datadir定義的目錄中文件:ibdata1, ibdata2, ...但這種不支持InnoDB

高級功能

(2) innodb_file_per_table=ON,意味着每表使用單獨的表空間文件;(支持高級功能如單表的導入導出)

每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於本身專用的表空間文件中,並存儲於數據庫目錄下: tbl_name.ibd

如我建立的是數據庫mydata

在/data/mysql下自動建立mydata目錄將數據存放在目錄下 mydata.ibd

表結構的定義:在數據庫目錄,tbl_name.frm

重啓:systemctl restart mysql

 

 這樣建立的表就是一個單獨的表空間在對應的庫中如用的mydb這個庫下存放

特性:

1 是事物引擎但不能大事物,比較適用小事物

2 使用匯集索引:把索引和數據存儲在一處,經過索引能直接找到數據,輔助索引指向彙集索引

3 支持自適應hash索引,用戶不能建立是有mysql自動維護的

4 鎖粒度:行級鎖,間隙鎖

innodb總結:

  1數據存儲:表空間;

  2併發:MVCC,間隙鎖,行級鎖;

    3索引:彙集索引、輔助索引;

  4性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;

  5 備份:支持熱備;

MyISAM:

  1支持全文索引(FULLTEXT index)但性能比較差、壓縮、空間函數(GIS);

  2不支持事務()

  3鎖粒度:表級鎖

  4適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);

  5文件:每一個表有三個文件,存儲於數據庫目錄中

    tbl_name.frm:表格式定義;

    tbl_name.MYD:數據文件;

    tbl_name.MYI:索引文件;

特性:

  1加鎖和併發:表級鎖;

  2修復:手動或自動修復、但可能會丟失數據;  

  3索引:非彙集索引;

  4延遲索引更新;

  5表壓縮;

其它的存儲引擎:

CSV:將CSV文件(以逗號分隔字段的文本文件)做爲MySQL表文件;

MRG_MYISAM:將多個MyISAM表合併成的虛擬表;

BLACKHOLE:相似於/dev/null,不真正存儲數據;

MEMORY:內存存儲引擎,支持hash索引,表級鎖,經常使用於臨時表;

FEDERATED: 用於訪問其它遠程MySQL服務器上表的存儲引擎接口;

SHOW  ENGINE  Innondb    status     查看引擎本身的狀態數據

 

事物:

併發控制:

鎖:Lock   機制

鎖類型 :

      讀鎖:共享鎖,可被多個讀操做共享;

      寫鎖:排它鎖,獨佔鎖;

鎖粒度:

      表鎖:在表級別施加鎖,併發性較低;每次讀寫都需鎖定整張表

      行鎖:在行級別施加鎖,併發性較高;維持鎖狀態的成本較大;

鎖策略:在鎖粒度及數據安全性之間尋求一種平衡機制;

      存儲引擎:級別以及什麼時候施加或釋放鎖由存儲引擎自行決定;

      MySQL Server:表級別,可自行決定,也容許顯式請求; 顯式鎖

鎖類別:

      顯式鎖:用戶手動請求的鎖;

      隱式鎖:存儲引擎自行根據須要施加的鎖;     

顯式鎖的使用:能夠同時鎖多個

(1) LOCK TABLES

LOCK TABLES  tbl_name  read|write, tbl_name read|write, ...

 UNLOCK  TABLES    解鎖

如:use  mydb

LOAK    TABLE    tbl2     read ;     讀鎖是另外一個線程能夠讀不可寫

(2) FLUSH TABLES       刷寫全部表 (把表中數據都寫到磁盤中去,並關閉這個表)  鎖定整個庫

FLUSH TABLES tbl_name,... [WITH READ LOCK];

  UNLOCK  TABLES;  解鎖

FLUSH    TABLES   with   read   lock;    把全部表在緩存中數據都寫入磁盤,並庫中

 

事務

鎖機制:

1鎖類型:

  讀鎖:共享鎖哦能夠被多個讀操做共享

  寫鎖:排他鎖,獨佔鎖

2鎖的粒度:

  表鎖:在表級別施加鎖,併發性較低;每次讀寫都需鎖定整張表

  行鎖:在行級別施加鎖,併發性較高;維持鎖狀態的成本較大;

3鎖策略:在鎖粒度及數據安全性之間尋求一種平衡機制;

  存儲引擎:級別以及什麼時候施加或釋放鎖由存儲引擎自行決定 自動的;

  MySQL Server(數據庫):表級別,可自行決定,也容許顯式請求; 顯式鎖

4鎖類別:

      顯式鎖:用戶手動請求的鎖 ,mysql級別的鎖都是顯示鎖;

      隱式鎖:存儲引擎自行根據須要施加的鎖 自動的;     

顯式鎖的使用方法:

  (1) LOCK TABLES

  LOCK TABLES  tbl_name  read|write, tbl_name read|write, ...

   UNLOCK  TABLES    解鎖,一下解全部表的鎖

use  mydb  用mydb這個庫爲列
>LOcK    TABLE    tbl2     read ;     讀鎖是另外一個線程能夠讀不可寫
>lock  table   tabl2  write : 

>unlock  tables:  解鎖

(2) FLUSH TABLES       刷寫全部表 (把表中數據都寫到磁盤中去,並關閉這個表)  鎖定整個庫

>FLUSH TABLES  tbl_name with read  lock;  #把全部表都刷寫一次,並讀鎖

>UNLOCK  TABLES;  解鎖

這個命令通常用在備份的時候,把全部表都讀鎖,別人可讀不可寫,這種備份叫溫備

別人不能讀不能寫叫冷備

別人既能夠讀也能夠寫叫熱備

 

事物:一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工做單元;

如銀行的一個帳戶加,與減, 先後數據要一致的

看是否支持一個事物須要滿住ACID測試

ACID測試:

A:AUTOMICITY,原子性;整個事務中的全部操做要麼所有成功執行,要麼所有失敗後回滾;這都是基於事物日誌進行的

C:CONSISTENCY,一致性;數據庫老是應該從一個一致性狀態轉爲另外一個一致性狀態;

I:ISOLATION,隔離性;一個事務所作出的操做在提交以前,是否能爲其它事務可見;出於保證併發操做之目的,隔離有多種級別; 事物之間隔離,隔離性高低取決於你的風險偏好,

D:DURABILITY,持久性;事務一旦提交,其所作出的修改會永久保存

事物日誌:是磁盤上一段連續的空間

  1把修改的操做先放在在日誌中

      2 日誌上的記錄會實時的同步到數據文件中

      3能夠利用裏面的記錄操做進行回滾

      4爲了避免讓在回滾或同步時間太長,通常事務日誌不要太大,不要暫存太多,

  5事物日誌都是按組出現的,一組至少2個當第一個寫滿,寫第二個,第一個趕快同步到數據文件中

  6 把事務日誌放在有冗餘的磁盤上最好,防止磁盤故障

事務有自動提交和手動提交,最好不要自動提交,容易形成單語句事

通常不建議自動提交事物

>select  @@session.auto_commit    # 查看自動提交功能 1 爲啓用

     Innodb_flush_log_at_trx_commit  1  #表在事務提交後要刷寫日誌,因一個爲自動的每一個語句都是一個事務,每一個語句結束都要刷寫磁盤,這樣io壓力會很大

 >Set  @@ session.auto_commit=0   修改成手動的,之後啓動事務要手動起了

手動控制事務:

>Start transactiom ;   啓動一個事務

  >  Insert  into  tbl2  values (2,’jerry’);

  > Update  tbl2  set  name = ‘Tom’  where id = 1;

  >Select  *  from  tbl2;

>Rollback;    滾回事務   每提交前回滾

  >  Select  *  from  tbl2   

>Savepoint  first;  設定保存點,方便滾回指定點

  >  Rollback  to  first   回滾第一個保護點

>Commit;  提交

事務隔離級別:

READ-UNCOMMITTED:讀未提交 --> 髒讀;隔離級過低 別人沒有提交的數據能夠看到

READ-COMMITTED:讀提交--> 不可重複讀;沒提交以前是不可讀

REPEATABLE-READ:可重複讀 --> 幻讀;在對方提交以前看不到修改的數據,在對方提交以後仍是看不到,只要本身沒有作什麼修改,但本身執行rollback後才能看到

SERIALIZABLE:串行化;當一個沒有提交或回滾以前,是操做阻塞的,只有當多方結束了,才能夠操做

如SELECT  @@session.tx_isolation;   查看

SET  @@sessio.tx_isolation=’READ-UNCOMMITTED’    修改級別

 

兩個用戶分別開啓一個事務,用戶1在修改沒提交,用戶2是能夠看到1的修改的
用戶1
    Start  transaction;
    Use mydb
    Insert  into  tbl2  values (3,’lucy’)
    Select *  from mydb.tbl2;
用戶2
>start  transaction;
    > Select *  from mydb.tbl2;

事務日誌中參數:

  Innodb_log_files_in_group    # 一組中有幾個文件

  Innodb_log_group_home_dir   # 事務日誌放哪,通常在數據目錄下 ib_logfile0,ib_logfile1

      Innodb_log_file_size    #日誌文件多大 ,最好不要太大

      Innodb_mirrires_log_groups  #鏡像日誌組

> SHOW  GLOBAL  VARIABLES   LIKE  ‘innodb%log%’;     查看

相關文章
相關標籤/搜索