mysql存儲引擎


 

1.引擎介紹&事務

引擎:數據存在數據庫中不同的格式和方法

mysql最常用引擎:MyISAM和InnoDB,在mysql5.5.5以前,默認的存儲引擎為MyISAM,之后版本默認為InnoDB

比較:InnoDB對事物完整性更好以及有更高的並發性

事務:邏輯上的一組SQL語句操作,組成這組操作的各SQL語句要么全成功要么全失敗。

事務的四大特性(ACID):原子性(不可分割的單位)、一致性、隔離性、持久性——四大特性適用於大多數關系型數據庫

2.MyISAM

mysql MyISAM三個系統文件:

表定義文件user.frm、數據文件user.MYD、索引文件user.MYI                  #通過file該文件可以看到其中內容

MyISAM特點:

1)不支持事務

2)表級鎖定(更新時鎖整個表)

3)讀寫互相阻塞

4)只會緩存索引(key_buffer_size),以大大提高訪問性能減少磁盤IO,但是不會緩存數據

5)讀取速度較快,占用資源相對少

6)不支持外鍵約束,但支持全文索引

MyISAM適用的場景:

1)不需要事務支持的業務

2)一般為讀數據比較多的網站應用,讀寫都頻繁的場景不適合,讀多或寫多的場合適合

3)並發訪問相對比較低的業務(純讀純寫高並發也可以)

4)數據修改相對較少的業務

5)以讀為主的業務,如www,blog,圖片信息數據庫,用戶數據庫,商品庫等業務

6)對數據一致性要求不是很高的業務

7)硬件資源比較差的機器還想打到比較好的效果可用MyISAM

MyISAM引擎調優:

1)設置合適的索引

2)調整讀寫優先級,根據實際需求保證重要操作更優先執行

3)啟用延遲插入改善大批量寫入性能(降低寫入頻率,盡可能多條數據一次性寫入)

4)盡量順序操作讓insert數據都寫入到尾部,減少阻塞

5)分解大的時間長的操作,降低單個操作的阻塞時間

6)降低並發數(減少對mysql訪問),對於高並發應用場景可采用排隊機制

7)對於更改不頻繁的數據,可用Query Cache或memcached緩存服務可以極大的提高訪問效率

關於mysql緩存的幾個參數:

query_cache_size = 256M

query_cache_limit = 1M

query_cache_min_res_unit = 2k

8)MyISAM的count只有在全表掃描的時候高效,帶有其他條件的count都需要進行實際的數據訪問

9)把主從同步的主庫使用InnoDB,從庫使用MyISAM引擎,但是出於維護數據庫的角度也不推薦此方法。

3.InnoDB

mysql InnoDB文件:

InnoDB特點:

1)支持事務:ACID

2)行級鎖定(更新時一般是鎖定當前行),通過索引實現,全表掃描仍然是鎖表,所以要建立索引

3)讀寫阻塞與事務隔離級別有關

4)具有高效的緩存特性

5)整個表和主鍵以cluster方式存儲,組成一棵平衡樹

6)所有secondary index都會保存主鍵信息

7)支持分區,表空間,類似oracle

8)支持外鍵約束,5.5以前的版本不支持全文索引,以后支持 

9)對硬件資源的要求相比MyISAM高

InnoDB適用的場景:

1)需要事務支持的業務

2)行級鎖對高並發有很好的適應能力,但需確保查詢通過索引完成

3)數據讀寫及更新較為頻繁的場景

4)數據一致性要求較高的業務

5)硬件設備內存較大,可用InnoDB較好的緩存能力來提高內存利用率,盡可能減少IO

InnoDB的參數,可查:grep innodb /etc/my.cnf

如果想將內容存放在不同的ibdata文件,可通過調整以下參數:

【mysqld】

innodb_file_per_table                             #按表生成文件

innodb_data_home_dir = /data/XXX

6)相比MyISAM引擎,InnoDB引擎更消耗資源,速度沒有MyISAM引擎快

InnoDB引擎調優:

1)主鍵盡可能小,避免secondary index帶來過大的空間負擔

2)避免全盤掃描

3)盡可能緩存所有的索引和數據,提高響應速度,減少磁盤IO消耗

4)在大批量小插入的時候,盡可能自己控制事務而不是使用autocommit自動提交,有開關可以控制提交方式

5)合理設置innodb_flush_log_at_trx_commit參數值(代表刷到磁盤上的頻率),不要過度追求安全

6)避免主鍵更新,因為會造成大量的數據移動

4.mysql引擎實戰

如何查看mysql里有幾個引擎可以用?

更改引擎:

方法1)alter table student ENGINE=MyISAM;

方法2)使用sed對備份內容進行引擎轉換,數據量會很大:

mysqldump > oldboy_1.sql

nohup sed -e 's/MyISAM/InnoDB/g' oldboy_2.sql > oldboy_1.sql

mysql < oldboy_1.sql

方法3)mysql_convert_table_format命令修改:

#!/bin/bash

cd /usr/local/mysql/bin

echo 'Enter Host Name:'

read HOSTNAME

echo 'Enter User Name:'

read USERNAME

...

./mysql_convert_table_format --host=$HOSTNAME --user=$USERNAME --password=$PASSWD --socket=$SOCKETPATH --type=$TBTYPE $DBNAME $TBNAME

即mysql_convert_table_format --user=root --password=456 --socket /data/3306/mysql.sock --engine=MyISAM oldboy t2                 #改oldboy庫表t2的引擎模式

#對於my.cnf要配置的參數,可以在以下位置找到官方的配置參數文件:

 

2018年11月7日

祝好!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM