mysql快取優勢與不足 MySQL優化之快取優化

2021-10-17 22:26:48 字數 4347 閱讀 2303

為了提高查詢速度,我們可以通過不同的方式去快取我們的結果從而提高響應效率。當我們的資料庫開啟了query cache(簡稱qc)功能後,資料庫在執行select語句時,會將其結果放到qc中,當下一次處理同樣的select請求時,資料庫就會從qc取得結果,而不需要去資料表中查詢。如果快取命中率非常高的話,有測試表明在極端情況下可以提高效率238%。

但乙個快取機制是否有效,效果如何,卻是乙個需要好好思考的問題。query cache有如下規則,如果資料表被更改,那麼和這個資料表相關的全部cache全部都會無效,並刪除之。這裡「資料表更改」包括: insert, update, delete, truncate, alter table, drop table, or drop database等。

舉個例子,如果資料表item訪問頻繁,那麼意味著它的很多資料會被qc快取起來,但是每一次item資料表的更新,無論更新是不是影響到了cache 的資料,都會將全部和item表相關的cache清除。如果你的資料表更新頻繁的話,那麼query cache將會成為系統的負擔。有實驗表明,糟糕時,qc會降低系統13%的處理能力。

1.1.1. 全域性快取

資料庫屬於io密集型的應用程式,其主職責就是資料的管理及儲存工作。而我們知道,從記憶體中讀取乙個資料庫的時間是微秒級別,而從一塊普通硬碟上讀取乙個 io是在毫秒級別,二者相差3個數量級。所以,要優化資料庫,首先第一步需要優化的就是io,盡可能將磁碟io轉化為記憶體io,也就是使用快取

啟動mysql時就要分配並且總是存在的全域性快取,可以在mysql的my.conf或者my.ini檔案的[mysqld]組中配置。

目前有:

key_buffer_size(預設值:402653184,即384m)、

innodb_buffer_pool_size(預設值:134217728即:128m)、

innodb_additional_mem_pool_size(預設值:8388608即:8m)、

innodb_log_buffer_size(預設值:8388608即:8m)、

query_cache_size(預設值:33554432即:32m)等五個。總共:560m.

1.1.1.1. key_buffer_size

key_buffer_size是用於索引塊的緩衝區大小,增加它可得到更好處理的索引(對所有讀和多重寫),對myisam表效能影響最大的乙個引數。如果你使它太大,系統將開始換頁並且真的變慢了。

嚴格說是它決定了資料庫索引處理的速度,尤其是索引讀的速度。對於內存在4gb左右的伺服器該引數可設定為256m或384m.

1.1.1.2. innodb_buffer_pool_size

innodb_buffer_pool_size:主要針對innodb表效能影響最大的乙個引數。功能與key_buffer_size一樣。innodb占用的記憶體,除innodb_buffer_pool_size用於儲存頁面快取資料外,另外正常情況下還有大約8%的開銷,主要用在每個快取頁幀的描述、adaptive hash等資料結構,如果不是安全關閉,啟動時還要恢復的話,還要另開大約12%的記憶體用於恢復,兩者相加就有差不多21%的開銷。

1.1.1.3. innodb_additional_mem_pool_size

innodb_additional_mem_pool_size 設定了innodb儲存引擎用來存放資料字典資訊以及一些內部資料結構的記憶體空間大小,所以當我們乙個mysql instance中的資料庫物件非常多的時候,是需要適當調整該引數的大小以確保所有資料都能存放在記憶體中提高訪問效率的。

1.1.1.4. innodb_log_buffer_size

innodb_log_buffer_size這是innodb儲存引擎的事務日誌所使用的緩衝區。類似於binlog buffer

innodb在寫事務日誌的時候,為了提高效能,也是先將資訊寫入innofb log buffer中,當滿足innodb_flush_log_trx_commit引數所設定的相應條件(或者日誌緩衝區寫滿)之後,才會將日誌寫到檔案 (或者同步到磁碟)中。可以通過innodb_log_buffer_size 引數設定其可以使用的最大記憶體空間。

innodb 將日誌寫入日誌磁碟檔案前的緩衝大小。理想值為 1m 至 8m。大的日誌緩衝允許事務執行時不需要將日誌儲存入磁碟而只到事務被提交(commit)。 因此,如果有大的事務處理,設定大的日誌緩衝可以減少磁碟i/o。 這個引數實際上還和另外的flush引數相關。一般來說不建議超過32mb

1.1.1.5. query_cache_size

query_cache_size: 主要用來快取mysql中的resultset,也就是一條sql語句執行的結果集,所以僅僅只能針對select語句。

當我們開啟了 query cache功能,mysql在接受到一條select語句的請求後,如果該語句滿足query cache的要求,mysql會直接根據預先設定好的hash演算法將接受到的select語句以字串方式進行hash,然後到query cache中直接查詢是否已經快取。如果已經在快取中,該select請求就會直接將資料返回,從而省略了後面所有的步驟(如sql語句的解析,優化器優化以及向儲存引擎請求資料等),極大的提高效能。

當然,query cache也有乙個致命的缺陷,那就是當某個表的資料有任何任何變化,都會導致所有引用了該錶的select語句在query cache中的快取資料失效。所以,當我們的資料變化非常頻繁的情況下,使用query cache可能會得不償失

1.1.2. 區域性快取

sort_buffer_size,read_rnd_buffer_size,tmp_table_size 大小的記憶體空間. 不過它們只是在需要的時候才分配,並且在那些操作做完之後就釋放了。

1.1.2.1. read_buffer_size

read_buffer_size是mysql讀入緩衝區大小。對錶進行順序掃瞄的請求將分配乙個讀入緩衝區,mysql會為它分配一段記憶體緩衝區。read_buffer_size變數控制這一緩衝區的大小。如果對錶的順序掃瞄請求非常頻繁,並且你認為頻繁掃瞄進行得太慢,可以通過增加該變數值以及記憶體緩衝區大小提高其效能.

1.1.2.2. sort_buffer_size

sort_buffer_size是mysql執行排序使用的緩衝大小。如果想要增加order by的速度,首先看是否可以讓mysql使用索引而不是額外的排序階段。如果不能,可以嘗試增加sort_buffer_size變數的大小

1.1.2.3. read_rnd_buffer_size

read_rnd_buffer_size 是mysql的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配乙個隨機讀快取區。進行排序查詢時,mysql會首先掃瞄一遍該緩衝,以避免磁碟搜尋,提高查詢速度,如果需要排序大量資料,可適當調高該值。但mysql會為每個客戶連線發放該緩衝空間,所以應盡量適當設定該值,以避免記憶體開銷過大。

1.1.2.4. tmp_table_size

tmp_table_size是mysql的heap (堆積)表緩衝大小。所有聯合在乙個dml指令內完成,並且大多數聯合甚至可以不用臨時錶即可以完成。大多數臨時表是基於記憶體的(heap)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含blob列的表儲存在硬碟上。

如果某個內部heap(堆積)表大小超過tmp_table_size,mysql可以根據需要自動將記憶體中的heap表改為基於硬碟的myisam表。還可以通過設定tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,mysql同時將增加heap表的大小,可達到提高聯接查詢速度的效果。

1.1.2.5. record_buffer:

record_buffer每個進行乙個順序掃瞄的執行緒為其掃瞄的每張表分配這個大小的乙個緩衝區。如果你做很多順序掃瞄,你可能想要增加該值。

1.1.3. 其它快取

1.1.3.1. table_cache

table_cache(5.1.3及以後版本又名table_open_cache),table_cache指定表快取記憶體的大小。每當mysql訪問乙個表時,如果在表緩衝區中還有空間,該錶就被開啟並放入其中,這樣可以更快地訪問表內容。

不能盲目地把table_cache設定成很大的值。如果設定得太高,可能會造成檔案描述符不足,從而造成效能不穩定或者連線失敗。

4.2.3.2 thread_cache_size (伺服器執行緒快取)

預設的thread_cache_size=8,,這個值表示可以重新利用儲存在快取中線程的數量,當斷開連線時如果快取中還有空間,那麼客戶端的執行緒將被放到快取中,如果執行緒重新被請求,那麼請求將從快取中讀取,如果快取中是空的或者是新的請求,那麼這個執行緒將被重新建立,如果有很多新的執行緒,

增加這個值可以改善系統效能.通過比較 connections 和 threads_created 狀態的變數,可以看到這個變數的作用。

mysql優化之快取優化

標籤:rop   應用   isa   頁面快取   record   upd   快取記憶體   五個   優化

優勢與不足

ted的乙個很有意思的演講,我覺得很受啟發。大概意思就是,我們要進行多個方面的任務切換,不能夠總是專注於乙個領域。可能類似於流水線,但同時強調慢過程,一點點打磨,這反而是一件非常高效的事情。首先,關注不同的領域,可以讓你在一件事遇到困難時,切換到另外乙個工作狀態,從而持續興奮的去工作。比如說馬斯克,...

微服務架構的優勢與不足

上篇文章給大家簡單介紹了一下微處理架構,現在我來為大家分析微服務架構的優勢與不足。微處理架構 處理複雜事物 許多公司,比如amazon ebay和netflix,通過採用微處理結構模式解決了上述問題。其思路不是開發乙個巨大的單體式的應用,而是將應用分解為小的 互相連線的微服務。乙個微服務一般完成某個...

微服務架構的優勢與不足(二)

微處理架構 處理複雜事物 許多公司,比如amazon ebay和netflix,通過採用微處理結構模式解決了上述問題。其思路不是開發乙個巨大的單體式的應用,而是將應用分解為小的 互相連線的微服務。乙個微服務一般完成某個特定的功能,比如下單管理 客戶管理等等。每乙個微服務都是微型六角形應用,都有自己的...