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 庫名 表名