配置文件設置緩存
my.ini 或 my.cy 找到 [mysqld]
query_cache_size = 20M #緩存大小 query_cache_type = ON #開啟緩存 table_cache=256 #用於限制緩存表的最大數目,如果當前已經緩存的表未達到table_cache,則會將新表添加進來;若已經達到此值,MySQL將根據緩存表的最后查詢時間、查詢率等規則釋放之前的緩存
參數調優
mysql> show global status like 'open%_tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 0 | #當前正在打開表的數量 | Opened_tables | 35 | #所有已經打開表的數量,建議table_cache 比Opened_tables的數值大一些 +---------------+-------+
查詢緩存相關配置參數
mysql> show variables like '%query_cache%'; +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | have_query_cache | YES | #是否支持查詢緩存 | query_cache_limit | 1048576 | #可緩存具體查詢結果的最大值 | query_cache_min_res_unit | 4096 | #查詢緩存是以塊來申請內存空間的,每次申請的塊大小為設定值 | query_cache_size | 0 | #查詢緩存的大小 | query_cache_type | ON | #關閉或是開啟緩存 | query_cache_wlock_invalidate | OFF | #該參數用於設置行級排它鎖與查詢緩存之間的關系,默認為為0(OFF),表示施加行級排它所的同時,該表的所有查詢緩存依然有效。如果設置為1(ON),表示事假行級排它鎖的同時,該表的所有查詢緩存失效。 +------------------------------+---------+
查詢緩存使用情況
mysql> show status like 'Qcache%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Qcache_free_blocks | 0 | #緩沖區碎片數量 | Qcache_free_memory | 0 | #表示當前MySQL服務實例的查詢緩存還有多少可用內存 | Qcache_hits | 0 | #使用查詢緩存的次數 | Qcache_inserts | 0 | #表示查詢緩存中此前總共緩存過多少條select 語句的結果集。 | Qcache_lowmem_prunes | 0 | #值非常大,則表明經常出現緩沖不夠的情況 | Qcache_not_cached | 0 | #表示沒有進入查詢緩存的select個數 | Qcache_queries_in_cache | 0 | #緩存中緩存這多少條select語句的結果集 | Qcache_total_blocks | 0 | #查詢緩存的總個數 +-------------------------+-------+
清理緩存碎片
mysql> flush query cache; Query OK, 0 rows affected (0.00 sec)
mysql> flush tables; #清空當前所有緩存的表
Query OK, 0 rows affected (0.00 sec)
mysql> reset query cache; #清理內存中的碎片
Query OK, 0 rows affected (0.00 sec)
MyISAM 存儲引擎緩存索引
key_buffer_size
是用於索引塊的緩沖區的大小,也稱為密鑰緩存
sql 緩存索引相關命令
mysql> SHOW STATUS like 'key_%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | Key_blocks_not_flushed | 0 | #MyISAM
密鑰緩存中已更改但尚未刷新到磁盤 的密鑰塊數 | Key_blocks_unused | 22365 | # 密鑰緩存 中未使用的塊數 | Key_blocks_used | 1 | #MyISAM
密鑰緩存 中已使用塊的數量。此值是一個高水位標記,表示一次使用過的最大塊數。 | Key_read_requests | 1 | # 從MyISAM
密鑰緩存中讀取密鑰塊的請求數 | Key_reads | 1 | # 從磁盤到MyISAM
密鑰緩存的密鑰塊的物理讀取次數,如果Key_reads
很大,那么你的key_buffer_size
價值可能太小了 | Key_write_requests | 0 | # 將密鑰塊寫入MyISAM
密鑰緩存的請求數 | Key_writes | 0 | # 密鑰塊從MyISAM
密鑰緩存到磁盤的物理寫入次數 +------------------------+-------+
高速緩存未命中率可以計算為 Key_reads/Key_read_requests
比率通常應小於0.01,Key_writes/Key_write_requests
如果您主要使用更新和刪除,則該比率通常接近1,但如果您傾向於同時執行影響多行的更新或者您正在使用DELAY_KEY_WRITE
表選項,則該比率可能會小得多。
注意:如果創建表時 ALTER TABLE table_name DELAY_KEY_WRITE= 1 需要在 my.ini 配置 [mysqld] 下添加 myisam-recover=BACKUP,FORCE,這樣在你啟動mysql的時候會檢查你的表並同步表和索引。
使用的密鑰緩沖區的分數可以 key_buffer_size
結合 Key_blocks_unused
狀態變量和緩沖區塊大小來確定 ,緩沖區塊大小可以從 key_cache_block_size
系統變量中獲得:1 - ((Key_blocks_unused * key_cache_block_size) / key_buffer_size)