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日
祝好!
