mysql--存儲引擎(四)

1.存儲引擎:常用的有MyISAM 和InnoDB。mysql的每種存儲引擎在mysql裏是通過插件的方式使用的。支持多種存儲引擎。

2.事務回顧

mysql支持事務的引擎:innodb/ndb。

事務四大特性,ACID 原子性,一致性,隔離性,持久性。

set autocommit=OFF 禁止自動提交 ON 開啓自動提交

rollback 回滾事務

commit 提交事務

3.MyISAM介紹

MySQL5.1 默認的存儲引擎是MyISAM,每一個MyISAM表都對應硬盤上的三個文件,同樣的文件名,不同的擴展名指示其類型用途.。

.frm文件保存表定義,這個文件不是MyISAM引擎的一部分,而是服務器的一部分。.MYD保存表的數據,.MYI是表的索引文件。而這兩個是MyISAM的

關鍵。比如在/data/3306/data下去查看mysql庫中的數據文件,

3.1 MyISAM引擎特點

不支持事務;

表級鎖定,更新時鎖整個表。雖然讓鎖定的實現成本很小,但是降低了併發性能。

讀寫時互相阻塞,但讀本身並不會阻塞另外的讀。

只緩存索引。通過key_buffer_size緩存索引,提高訪問性能減少磁盤io,但是這個緩存區只緩存索引,不緩存數據。

grep key_buffer my.cnf

key_buffer_size = 16M

讀取速度快,佔用資源相對少。

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

3.2MyISAM引擎適合的生產業務場景

不需要事務支持的業務

數據修改相對較少(阻塞問題)

適合讀多的應用,比如www,blog,用戶數據庫,商品庫,圖片信息庫

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

硬件資源比較差的機器

小結:單一對數據庫操作,儘量純讀,或者純寫。

3.3 調優精要

設置合適的索引(緩存)

調整讀寫優先級,根據實際需要確保重要操作先執行

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

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

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

降低併發數(減少對mysql訪問),某些高併發場景通過應用進行排隊隊列機制實現。

對於相對靜態的數據庫數據,充分利用Query Cache或者memcached緩存服務可以極大的提高訪問效率。

[root@hdp4 3306]# grep query my.cnf

query_cache_size = 2M

query_cache_limit = 1M

query_cache_min_res_unit = 2k

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

可以把主從同步的主庫用innodb,從庫用myisam.

4.innodb引擎

4.1 特點

支持事務。

行級鎖定,更新時鎖定當前行,通過索引時間,全表掃描仍然是表鎖。

讀寫阻塞與事務隔離級別相關

整個表和主鍵以Cluster方式存儲,組成一棵平衡樹。

所有Sencondary Index都會保存主鍵信息。

支持分區,表空間。

支持外鍵,對硬件資源要求比較高

4.2 適合的生產業務場景

需要事務支持的業務

行級鎖定對高併發有很好的適應能力,但需要確保查詢是通過索引完成 的。

數據讀寫及更新都較爲頻繁,比如bbs,微博

數據一致性要求高的業務,比如銀行卡轉賬

硬件設備內存較大,可以利用innodb 的緩存能力來提高內存利用率,儘可能減少磁盤io。

共享表空間對應物理數據文件:/data/3306/data/ibdata1

獨立表空間對應物理數據文件:

innodb_file_per_table

innodb_data_home_dir=/data/xxx

4.3 調優精要

主鍵儘可能小,避免給Secondary index帶來過大的空間負擔。

避免全表掃描,因爲會使用表鎖。

儘可能緩存所有的索引和數據,提高響應速度,減少磁盤io消耗。

在大批量小插入的時候,儘量自己控制事務而不適用autocommit自動提交,

合理設置innodb_flush_log_at_trx_commit參數值,不要過度追求安全性,如果這個值設置爲0,log buffer每秒就會被刷寫日誌文件到磁盤,提交事務的時候不做任何操作。一般設置爲2.

避免主鍵更新,會帶來大量數據移動。

5.修改引擎

5.1 alter table stu ENGINE=INNODB或者是MyISAM

5.2 使用sed對備份內容進行殷勤轉換

5.3 mysql_convert_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=MyISAM 庫名 表名

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章