1. 程式人生 > >MySQL的常見儲存引擎介紹與引數設定調優(轉載)

MySQL的常見儲存引擎介紹與引數設定調優(轉載)

原文地址:http://www.cnblogs.com/demon89/p/8490229.html

MySQL常用儲存引擎之MyISAM

特性:
    1、併發性與鎖級別
    2、表損壞修復
        check table tablename
        repair table tablename
    3、MyISAM表支援的索引型別
        ①、全文索引
        ②、字首索引
    4、MyISAM表支援資料壓縮
        myisampack
限制:
    版本 < MySQL5.0時預設表大小為4G
    如儲存達標則要修改MAX_Rows和AVG_ROW_LENGTH
    版本 > MySQL5.0時預設支援為256TB

適用場景:
    1、非事務形應用
    2、只讀類應用
    3、空間類應用

MySQL常用儲存引擎之Innodb

Innodb儲存引擎的特徵
    1、Innodb是一種事務性儲存引擎
    2、完全支援事務的ACID特性
    3、Redo Log 和 Undo Log
    4、Innodb支援行級鎖

Innodb使用表空間進行 資料儲存
    為每個表獨立建立一個表空間儲存
        innodb_file_per_table
            ON:獨立表空間:tablename.ibd
            OFF:系統表空間:ibdataX(X是個數字,從1開始的數字)
    
系統表空間和獨立表空間要如何選擇
    比較:
        系統表空間無法撿的收縮檔案大小
        獨立表空格鍵可以通過optimize table命令收縮系統檔案
        系統表空間會產生IO瓶頸
        獨立表空間可以同時向多個檔案重新整理資料
    
錶轉移的步驟
    步驟:
        1、使用mysqldump到處所有資料庫表資料
        2、停止MySQL服務,修改引數,並刪除Innodb相關檔案
        3、重啟MySQL服務,重建Innodb系統表空間
        4、重新匯入資料

MySQL常見的儲存引擎之CSV

檔案系統儲存特點
    1、資料以文字方式儲存在文字中
    2、.csv檔案儲存表內容
    3、.csm檔案儲存表的元資料如表狀態和資料量
    4、.frm檔案儲存表結構資訊
    5、以csv格式進行儲存
    6、所有列必須都是不能為Null的
    7、不支援索引

    適用場景:
        適用作為資料交換的中間表(電子表格->csv檔案->MySQL資料庫目錄)

MySQL常用儲存引擎之Archive

檔案系統儲存特點
    1、以zlib對錶資料進行壓縮,磁碟I/O更少
    2、資料儲存在ARZ為字尾的檔案中

Archive儲存引擎的特點
    1、只支援insert和select操作
    2、只允許在自增的ID列上加索引
    
    適用場景:
        日誌和資料採集類應用

MySQL常用儲存引擎之Memory

檔案系統儲存特點
    1、也成HEAP儲存引擎,所以資料儲存在記憶體中

功能特點:
    1、支援HASH索引和Btree索引
    2、所有欄位都有固定長度varchar(10)=char(10)
    3、不支援BLOG和TEXT等大欄位
    4、Memory儲存引擎使用表級鎖
    5、最大大小由max_heap_table_size引數決定

    適用場景:
        1、用於查詢或者是對映表,例如郵編和地區的對應表
        2、用於儲存資料分心中產生的中間表
        3、用於快取週期性聚合資料的結果表

MySQL常用儲存引擎之Federated

特點:
    1、提供了訪問遠端MySQL伺服器上表的方法
    2、本地不儲存資料,資料全部放到遠端伺服器上
    3、本地需要儲存表結構和遠端伺服器的連線資訊

如何使用
    預設靜止,啟用需要在啟動時增加federated引數
    mysql://user_name[:password]@host_name[:port]/db_name/table_name

    適用場景:
        偶爾的統計分析及手工查詢
    
    

如何選擇正確的儲存引擎

參考條件
    1、是否要支援事務
    2、定期備份
    3、崩潰恢復
    4、儲存引擎的特有特性

Mysql的伺服器引數介紹

MySQL獲取配置資訊路徑
    1、命令列引數
        mysqld_safe --datadir=/data/sql_data
    2、配置檔案
        檢視配置檔案的命令:
        [[email protected] ~]# mysqld --help --verbose | egrep -A 1 'Default options'
        配置檔案的有效路徑
            /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

MySQL配置引數的作用域
    1、全域性引數
        set global 引數名=引數值;
        set @@global.引數名:=引數值;
    2、會話引數 
        set [session] 引數名=引數值;
        set @@session.引數名:=引數值;

記憶體配置相關引數
    1、確定可以使用的記憶體的上限
    2、確定MySQL的每個連線使用的記憶體
        sort_buffer_size
        join_buffer_size
        read_buffer_size
        read_rnd_buffer_size
    3、確定需要為作業系統保留多少記憶體
    4、如何為快取池分配記憶體
        Innodb_buffer_pool_size
            注:設定快取池的大小的考量標準為:總記憶體-(每個程式設計所以需要的記憶體*連線數)-系統保留記憶體
        key_buffer_size
        select sum(index_length) from information_schema.tables where engines='myisam'
    
I/O相關配置引數
    Innodo I/O相關配置
    Innodb_log_file_size 單個事務日誌的大小
    Innodb_log_files_in_group 控制檔案日子的個數
    事務日誌總大小 = Innodb_log_files_in_group * Innodb_log_file_size
    Innodb_log_buffer_size = (32M or 128M)
    Innodb_flush_log_at_trx_commint
        0:每秒進行一次log寫入cache,並flush log到磁碟
        1[預設]:在每次事務提交執行log寫入cache,並flush log到磁碟
        2[建議]:每次事務提交,執行log資料寫入到cache中,每秒執行一次flush log到磁碟
    Innodb_flush_method=O_DIRECT
    Innodb_file_per_table = 1
    Innodb_doublewrite = 1

MyISAM I/O相關配置
    delay_key_write
        OFF:每次寫操作後重新整理鍵緩衝中的髒塊到磁碟
        ON:只對在鍵表時指定了delay_key_write選項的表使用延遲重新整理
        ALL:對所有的MyISAM表都使用延遲建寫入
        
安全相關配置引數
    expire_logs_days 指定自動清理binlog的天數
    max_allowed_packet 控制MySQL可以連線的包大小,建議設定為32M,如果使用了主從複製,引數應該設定成一致的
    skip_name_resolve 禁用DNS查詢
    sysdate_is_now 確保sysdate()返回確保性日期
    read_only 禁止非super許可權的使用者寫操作  注:建議在主從複製中的從庫開啟此功能。以確保不能修改從庫中的操作,只能從主庫同步過來
    skip_slave_start 禁用Salve自動恢復(從庫中的設定使用)
    sql_mode 設定MySQL所使用的SQL模式 (謹慎操作,可能會造成MySQL無法執行)
        ① strict_trans_tables 給定的資料如果不能插入到資料庫中,對事務引擎會終端操作,對非事務引擎是沒有影響的
        ② no_engine_subitiution 在create table中指定engines的時候,如果引擎不可用,不會使用預設引擎建立表
        ③ no_zero_date 不能再表中插入0年0月0日的日期
        ④ no_zero_in_date 不接受一部分的為0的日期
        ⑤ noly_full_group_by 
    
其他常用的配置引數
    sync_binlog 控制MySQL如何向磁碟重新整理binlog
    tmp_table_size 和 max_heap_table_size 控制記憶體臨時表大小(不宜設定的太大,以避免記憶體的溢位)
    max_connections 控制允許的最大連線數(預設為100,有點小,根據自己的業務適當的調整大小)

什麼影響了效能

資料庫設計對效能的影響
    1、過分的反正規化化為表建立太多的列
    2、過分的正規化化造成太多的表關聯(關聯的表儘可能的控制在10個之內)
    3、在OLTP環境中使用不恰當的分割槽表
    4、使用外來鍵保證資料的完整性

總結

效能優化的順序
    1、資料庫結構設計和SQL語句
    2、資料庫儲存引擎的選擇引數配置
    3、系統選擇及優化
    4、硬體升級