對于應用程序和用戶來說,同樣一張表的數據無論用什么引擎來存儲,看到的數據都是一樣的,只是不同的引擎在功能、占用空間大小、讀取性能等方面可能有所差別。
mysql最常用的存儲引擎為Innodb、MyISAM和全文索引
5.5.5以前默認存儲引擎為MyISAM,5.5.5及之后默認存儲引擎為Innodb
mysql> show engines \G查看當前數據庫系統支持的引擎
mysql5.5支持事務的引擎:Innodb/ndb(集群的引擎)
對于MyISAM來說,每一個表對應于磁盤上的三個文件,這三個文件名稱相同,擴展名不同。
.frm文件保存表的定義(是服務器而不是MyISAM引擎的一部分),.MYD保存表的數據,.MYI是表的索引文件(可參考mysql的系統庫mysql下的文件)
特點:
1.不支持事務
2.表級鎖定(更新時鎖定整個表),鎖定的成本小,但大大降低了并發性能
3.讀寫互相阻塞,不僅會在寫入的時候阻塞讀取,還會在讀取的時候阻塞寫入,但是讀不會阻塞另外的讀
4.只會緩存索引不能緩沖數據,可以通過key_buffer_size緩存索引,減少磁盤IO,但是只會緩存索引不會緩存數據
5.讀取速度較快,占用資源相對少(功能相對弱,鎖的粒度大)
6.不支持外鍵約束,但支持全文索引
7.mysql5.5.5默認的存儲引擎
適用的生產場景:單一對數據庫的操作(純讀或者純寫)可以使用
1.不需要事務支持的業務(例如轉賬、充值就不行)
2.一般為讀多或者寫多的網站應用,讀寫都頻繁的場景不適合
3.讀寫并發相對較低的業務(純讀純寫高并發也可以)
4.數據修改相對較少的業務
5.以讀為主的業務,例如www、blog、圖片信息數據庫
6.對數據一致性要求不很高的業務
7.硬件資源相對較差的機器
調優精要:
1.設置合適的索引
2.調整讀寫優先級,根據實際需要確保重要的操作更優先執行
3.啟用延遲插入改善大批量寫入性能(降低寫入頻率)
4.盡量順序操作,讓insert數據都寫入到尾部,減少阻塞
5.分解大的時間長的操作,降低單個操作的阻塞時間
6.降低并發數,某些高并發場景通過應用進行排隊隊列機制
7.對于相對靜態(更改不頻繁)的數據庫數據,充分利用query cache或者mamcached緩存服務極大的提高訪問效率
8.count只有在全表掃描的時候高效,帶有其他條件的count都需要進行實際的數據訪問
9.可以把主從同步的主庫使用Innodb,從庫使用MyISAM引擎(不推薦)
Innodb
特點:
1.支持事務
2.行級鎖定(更新時一般鎖定當前行),通過索引實現,如果進行全表掃描仍然會鎖全表與MyISAM相同,注意間隙鎖的影響
3.讀寫阻塞與事務隔離級別相關
4.具有高效的緩存特性,能緩存索引,也能緩存數據
5.整個表和主鍵以cluster方式存儲,組成一棵平衡樹
6.所有secondary index都會保存逐漸信息
7.支持分區和表空間,類似oracle數據庫
8.支持外鍵約束,5.5以前不支持全文索引,后續支持
9.與MyISAM相比對硬件資源要求相對較高
適用場景:
1.需要事務支持的業務
2.行級鎖定對高并發有很好的適應能力,但需要確保查詢通過索引完成
3.數據讀寫及更新都較為頻繁的場景,如bbs、sns、微博、微信等
4.對數據一致性要求較高的業務,例如充值轉賬
5.硬件設備內存大,可以利用Innodb較好的緩存能力來提高內存利用率,盡可能減少磁盤IO
6.與MyISAM引擎相比,Innodb引擎更消耗資源,速度沒有MyISAM快
調優精要:
1.主鍵盡可能小,避免給secondary index帶來過大壓力
2.避免全表掃描,否則會使用表鎖
3.盡可能緩存所有的索引和數據,提高響應速度,減少磁盤IO消耗
4.在大批量小插入的時候,盡量自己控制事務,而不要使用autocommit
4.合理設置innodb_flush_log_at_trx_commit,不要過度追求安全性
5.避免主鍵更新,這會帶來大量的數據移動
事務:邏輯上的一組sql語句操作,這組sql語句執行時要么全部成功要么全部失敗
事務的四大特性ACID
原子性(atomicity):事務是一個不可分割的單位,一個事務中的所有sql操作要么全部成功要么全部失敗
一致性(consistency):事務發生前和發生后,事務的完整性必須保持一致
隔離性(isolation):當并發訪問數據庫時,一個正在執行的事務在執行完畢前,對于其他會話是不可見的,多個并發事務之間的數據是互相隔離的(mysqldump時的參數--single-transaction)
持久性(durability):一個事務一旦被提交,它對數據庫中的數據改變就是永久性的,如果出了錯誤,事務不允許撤銷,只能通過“補償性事務”
mysql數據庫的事務默認是自動提交的。如果想多條sql在一個事務中執行,則需要使用事務進行處理。如果開啟一個事務沒有提交,mysql會自動回滾事務,或者手動使用rollback回滾。
start transaction開啟事務
rollback回滾事務
commit提交事務
mysql> show variables like '%commit%';結果為on或者off(默認為on)
表創建后修改引擎的方法
1.mysql語句修改
mysql> alter table test2 engine=MyISAM;
2.使用sed對備份內容進行引擎替換,即用mysqldump備份,使用sed對引擎做替換,再導入替換后的備份語句
3.linux命令mysql_convert_table_format修改