什麼影響了mysql的性能-存儲引擎層

5.6版本之前默認是MyISam存儲引擎,5.6版本以後默認支持的Innodb存儲引擎,這兩種也是最經常使用的.html

存儲引擎層mysql

  • MyISAM 5.5以前版本默認存儲引擎
    • 存儲引擎表由MYD和MYI組成sql

    • 特性(只讀還能夠接受)shell

      • 併發性和鎖級別(表級鎖)數據庫

      • 表損壞修復,不支持事務緩存

        check table tablename
        檢查表
        repqir table tablename
        恢復表
        # 經過engine指定存儲引擎
        create table myIsam(id int,c1 varchar(10))engine=myisam;
      • MyISam表支持的索引類型服務器

      • MyISAM表支持數據壓縮併發

        # 命令行: myisampack
      • 適用場景:spa

        • 非事務型應用
        • 只讀類應用
        • 控件類應用

    http://www.javashuo.com/article/p-pjimmmvh-cc.html命令行

    • 存儲引擎之Innodb(5.5以後默認存儲引擎)
    • 判斷獨立表空間和共享表空間的方法

      一、在配置文件my.cnf裏面設置innodb_file_per_table=0,重啓MySQL服務,建立表common_tablespace,你會在數據目錄看到只有common_tablespace.frm文件。

      若是表的存儲引擎是InnoDB,並且表空間(tablespace)是共享表空間的話,那麼數據庫對應目錄下面是沒有"表名.ibd"文件的。獨立表空間的表的話,則有"表名.ibd"文件。只是這個方法很笨,對於生產環境,大量的表經過這種方式判別,確實不是一個好方法。

      二、MySQL 5.6 INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 關於這個系統表提供了有關表格的格式和存儲特性,包括行格式,壓縮頁面大小位級別的信息(如適用),INNODB的表空間信息。

      # 共享表空間
      SELECT TABLE_SCHEMA
          ,TABLE_NAME
          ,TABLE_TYPE
          ,N'共享表空間' AS TABLE_SPACE
          ,ENGINE
          ,VERSION
          ,TABLE_ROWS
          ,AVG_ROW_LENGTH
          ,CREATE_TIME
          ,UPDATE_TIME
      FROM INFORMATION_SCHEMA.TABLES  T
      LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME
      WHERE I.NAME IS NULL  AND T.TABLE_SCHEMA='MyDB' AND T.ENGINE='InnoDB';
      
      #獨立表空間
      SELECT TABLE_SCHEMA
          ,TABLE_NAME
          ,TABLE_TYPE
          ,N'獨立表空間' AS TABLE_SPACE
          ,ENGINE
          ,VERSION
          ,TABLE_ROWS
          ,AVG_ROW_LENGTH
          ,CREATE_TIME
          ,UPDATE_TIME
      FROM INFORMATION_SCHEMA.TABLES  T
      INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME
      WHERE T.TABLE_SCHEMA='MyDB'  AND T.ENGINE='InnoDB';

      三、若是是MySQL 5.7的話, 比MySQL 5.6有多了一種方法,MySQL 5.7 的INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中多了SPACE_TYPE字段,不過其值所有爲Single,而INFORMATION_SCHEMA.INNODB_SYS_TABLES中也多了字段SPACE_TYPE, 其值有Single與System 分別表示單獨表空間和共享表空間。

      #獨立表空間
      SELECT * FROM
      INFORMATION_SCHEMA.INNODB_SYS_TABLES
      WHERE SPACE_TYPE='Single';
      #共享表空間
      SELECT * FROM  INFORMATION_SCHEMA.INNODB_SYS_TABLES
      WHERE SPACE_TYPE='System';

      四、若是是MySLQ 8.0的話,還多了一種方法, 那就是經過INFORMATION_SCHEMA.INNODB_TABLES來判斷,這個新增的系統表能夠經過SPACE_TYPE字段來區分共享表空間與獨立表空間

      SELECT * FROM  INFORMATION_SCHEMA.INNODB_TABLES WHERE SPACE_TYPE=’Single’;
      • 使用表空間進行數據存儲

        innodb_file_per_table
        ON: 獨立表空間: tablename. ibd
        OFF: 系統表空間:ibdataX
      • 系統表空間和獨立表空間要如何選擇

        比較:

        • 系統表空間沒法簡單的收縮文件大小
        • 系統表空間會產生IO瓶頸
        • 獨立表空間能夠收縮文件大小
        • 獨立表空間能夠同時向多個文件刷新數據

        錶轉移的步驟:

        • 使用mysqldump導出全部數據庫表數據
        • 中止Mysql服務,修改參數,並刪除Innodb相關文件
        • 重啓Mysql服務,重建Innodb系統表空間
      • Innodb存儲引擎的特性

        • Innodb是一種事務性存儲引擎
        • 徹底支持事務的ACID特性
        • Redo Log 和 Undo Log
        • Innodb支持行級鎖
          • 行級鎖能夠最大程度的支持併發
          • 行級鎖是由存儲引擎層實現的

        什麼是鎖

        • 鎖對主要做用是管理共享資源的併發訪問
        • 鎖用於實現事務的隔離性

        打個比方: 郵件系統,當兩個用戶向同一地址發送郵件時,這時候只會有一個用戶發送成功,另一個會暫時阻塞,這就是鎖也就是事務特性中的隔離性,避免了損壞數據。

        鎖的類型

        • 共享鎖(也稱爲讀鎖,多個線程能夠同時進行)
        • 獨佔鎖(也稱寫鎖,只能單線程訪問是互斥)

        鎖的粒度

        相互之間不存在阻塞,鎖的單元越小支持併發越高,好比innodb支持行級鎖,這樣當須要寫入數據時只會對單行操做而不影響其餘數據的並行操做,粒度主要就是對操做數據的鎖的單元。

        • 表級鎖(服務器層)
        • 行級鎖

        阻塞和死鎖

        • 什麼是阻塞(一個鏈接在等待另外一個鏈接資源斷開)
        • 什麼是死鎖(兩個或兩個以上相互佔用對方佔用的資源)

        Innodb狀態檢查

        show engine innodb status

        適用場景

        Innodb適合於大多數OLTP應用

        存儲引擎之Memory
        • 文件系統儲存特色
          • 也稱爲HEAP存儲引擎,因此數據保存在內存中
          • 當服務器重啓後數據會丟失表結構不會丟失(數據索引保存在內存中)
        • 功能特色
          • 支持HASH索引和BTree索引
          • 全部字段爲固定長度varchar(10)=char(10)
          • 不支持BLOG和TEXT等打字段(浪費很大資源空間)
          • Memory存儲引擎使用表級鎖
          • 最大大小是由max_heap_table_size參數決定
        • 使用場景(數據易丟失,因此要求數據可再生)
          • 用於查找或者是映射表,例如郵編和地區的對應
          • 用於保存數據分析中產生的中間表
          • 用於緩存週期性聚合數據的結果表
相關文章
相關標籤/搜索