MyISAM和InnoDB引擎優化分析

2022-10-06 02:03:07 字數 3220 閱讀 1778

這幾天喻名堂在學習mysql資料庫的優化並在自己的伺服器上進行設定,喻名堂主utkgx要學習了myisam和innodb兩種引擎的優化方法,它們各有優缺點,一般在實際應用中將兩種引擎結合起來使用效果會更好。喻名堂測試的硬體配置以及軟體環境如下:

伺服器型號:ibm s226

cpu:至強四核

記憶體:4g

硬碟:兩個80g做raid1

系統:windows server 2003 sp1 32位企業版

mysql版本:5.5

根據自己伺服器的實際情況,優化過和引數如下:

一、公共選項

skip-external-locking //避免mysql的外部鎖定,減少出錯機率增強穩定性。

skip-name-resolve //禁止mysql對外部連線進行dns解析,使用這一選項可以消除mysql進行dns解析的時間。但需要注意,如果開啟該選項,則所有遠端億恩科技主機連線授權都要使用ip位址方式,否則mysql將無法正常處理連線請求!

max_connections = 1024 //指定mysql允許的最大連線程序數。如果在訪問論壇時經常出現too many connections的錯誤提示,則需要增大該引數值。

query_cache_size = 16m //預設為0,就是不啟用。指定mysql查詢緩衝區的大小。可以通過在mysql控制台執行以下命令觀察:

# > show variables like '%query_cache%';

# > show status like 'qcache%';

# 如果qcache_lowmem_prunes的值非常大,則表明經常出現緩衝不夠的情況;

如果qcache_hits的值非常大,則表明查詢緩衝使用非常頻繁,如果該值較小反而會影響效率,那麼可以考慮不用查詢緩衝;qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多。

sort_buffer_size = 6m //每個執行緒的排序快取大小,該選項對排序order by、group by起作用。注意:該引數對應的分配記憶體是每連線獨佔!如果有100個連線,那麼實際分配的總共排序緩衝區大小為100 6 = 600mb。所以,對於內存在4gb左右的伺服器推薦設定為6-8m。

record_buffer=16m //每個進行乙個順序掃瞄的執行緒為其掃瞄的每張表分配這個大小的乙個緩衝區,可以設定為2m以上

table_cache = 512 //為所有執行緒開啟表的數量。增加該值能增加mysqld要求的檔案描述符的數量。mysql對每個唯一開啟的表需要2個檔案描述符。

二、myisam選項

key_buffer_size = 256m //key_buffer_size指定用於索引的緩衝區大小,增加它可得到更好的索引處理效能。對於內存在4gb左右的伺服器該引數可設定為256m或384m。

注意:該引數值設定的過大反而會是伺服器整體效率降低!

read_buffer_size = 4m //讀查詢操作所能使用的緩衝區大小。和sort_buffer_size一樣,該引數對應的分配記憶體也是每連線獨享!

myisam_sort_buffer_size = 64m //預設為16m。設定、恢復、修改表的時候使用的緩衝大小,值不要設的太大。

join_buffer_size = 8m //聯合查詢操作所能使用的緩衝區大小,和sort_buffer_size一樣,該引數對應的分配記憶體也是每連線獨享!

三、innodb選項

innodb_buffer_pool_size=1g //乙個innodb最重要的引數,這個引數和myisam的key_buffer_size有相似之處,但也是有差別的。這個引數主要快取innodb表的索引,資料,插入資料時的緩衝,設定得越大,訪問表裡面資料時所需要的磁碟i/o越少,一般是記憶體的一半,不超過2g,否則系統會崩潰。為innodb加速優化首要引數。該引數分配記憶體的原則:這個引數預設分配只有8m,可以說是非常小的乙個值。如果是乙個專用db伺服器,那麼他可以佔到記憶體的70%-80%。這個引數不能動態更改,所以分配需多考慮。分配過大,會使swap占用過多,致使mysql的查詢特慢。如果你的資料比較小,那麼可分配是你的資料大小+10%左右做為這個引數的值。

例如:資料大小為50m,那麼給這個值分配innodb_buffer_poo程式設計客棧l_size=64m

innodb_additional_mem_pool_size=16m //用來存放innodb的內部目錄這個值不用分配太大,系統可以自動調。不用設定太高。通常比較大資料設定16m夠用了,如果表比較多,可以適當的增大。如果這個值自動增加,會在error log有中顯示的。

innodb_log_file_size=256m //在日誌組中每個日誌檔案的大小,一般是innodb_buffer_pool_size的25%,官程式設計客棧方推薦是innodb_buffer_pool_size的40-50%。一般控制在幾個log檔案相加大小在2g以內為佳。具體情況還需要看你的事務大小,資料大小為依據。說明:這個值分配的大小和資料庫的寫入速度,事務大小,異常重啟後的恢復有很大的關係。

innodb_log_files_in_group=2 //指定你有幾個日誌組。分配原則:一般我們可以用2-3個日值組。預設為兩個。

innodb_log_buffer_size=3m //事務在記憶體中的緩衝。分配原則:控制在2-8m.這個值不用太多的。他裡面的記憶體一般一秒鐘寫到磁碟一次。具體寫入方式和你的事務提交方式有關。在oracle等資料庫了解這個,一般最大指定為3m比較合適。

innodb_flush_l程式設計客棧ogs_at_trx_commit=0 //控制事務的提交方式分配原則:這個引數只有3個值,0,1,2請確認一下自已能接受的級別。預設為1,主庫請不要更改了。效能更高的可以設定為0或是2,但會丟失一秒鐘的事務。說明:這個引數的設定對innodb的效能有很大的影響,所以在這裡給多說明一下。當這個值為1時:innodb 的事務log在每次提交後寫入日值檔案,並對日值做重新整理到磁碟。這個可以做到不丟任何乙個事務。當這個值為2時:在每個提交,日誌緩衝被寫到檔案,但不對日誌檔案做到磁碟操作的重新整理,在對日誌檔案的重新整理在值為2的情況也每秒發生一次。但需要注意的是,由於程序呼叫方面的問題,並不能保證每秒100%的發生。從而在效能上是最快的。但作業系統崩潰或掉電才會刪除最後一秒的事務。當這個值為0時:日誌緩衝每秒一次地被寫到日誌檔案,並且對日誌檔案做到磁碟操作的重新整理,但是在乙個事務提交不做任何操作。mysqld程序的崩潰會刪除崩潰前最後一秒的事務。

從以上分析,當這個值不為1時,可以取得較好的效能,但遇到異常會有損失,所以需要根據自已的情況程式設計客棧去衡量。

本文標題: myisam和innodb引擎優化分析

本文位址:

Mysql引擎 Innodb和MyISAM的區別

本文是摘抄其他網文整理而成。create database engine innodb mysql 資料庫分為innodb和myisam兩類。兩者最主要的區別是 innodb支援事務處理 外來鍵和行級鎖.而myisam不支援,所以如果cud比較頻繁或要求事務一致性的,使用innodb比較好,反之使用...

InnoDB和MyISAM儲存引擎

mysql在檔案系統中將每個資料庫 也可以叫 schema 儲存為資料庫目錄下的乙個子目錄。建立表時,mysql會在資料庫子目錄下建立乙個和表同名的.frm檔案儲存表的定義。而 mysql會在資料庫子目錄下建立乙個和表同名的.frm檔案儲存表的定義。如 建立乙個名為a的表,mysql會在a.frm檔...

MyISAM和InnoDB引擎優化

一 公共選項 skip external locking 避免mysql的外部鎖定,減少出錯機率增強穩定性。skip name resolve 禁止mysql對外部連線進行dns解析,使用這一選項可以消除mysql進行dns解析的時間。但需要注意,如果開啟該選項,則所有遠端主機連線授權都要使用ip位...