2015-06-29 46 views
0

我正在運行一個自編碼的PHP-MySQL網站,並啓用具有以下配置的查詢緩存。查詢緩存和緩衝池無法提供幫助,在磁盤上創建大量表格

query_cache_type = 1 
query_cache_size = 20M 
query_cache_limit = 4096 
query_cache_min_res_unit = 4096 

tmp_table_size = 512M 
max_heap_table_size = 512M 

,因爲我能讀懂上面的配置:

  • 查詢緩存啓用
  • 不緩存查詢,其結果大小大於4096個字節
  • 總查詢,可以是在緩衝區中容納大約5000個查詢結果(20MB/4KB = 5000)

我不明白如何tmp_table_sizemax_heap_table_size將有助於查詢緩存。這些變量與在內存或磁盤上創建的臨時表相關(如果需要)。

innodb_buffer_pool_size = 4G 
innodb_buffer_pool_instances = 4 

系統有32GB的內存,其中大部分時間裏差不多有50%的內存空了。因此,我已將innodb_buffer_pool_size設置爲4G。數據庫大小約爲900MB,每天增長大約2MB。

我得到下面的輸出與mysqltuner實用

Key buffer hit rate: 69.3% 
Temporary tables created on disk: 75% 
Query cache efficiency: 5.9% 

看起來我已經設置了一些錯誤配置。讓我知道應該改進什麼。

回答

0

溫度表(SELECTs)上有多個原因磁盤結束:

  • SELECT列表包括TEXTBLOB列(或大VARCHARVARBINARY
  • 在TMP表比更大任一的tmp_table_sizemax_heap_table_size

「查詢緩存」是一個不同的動物。首先要注意的是有用的,只有當

  • 相同SELECT正在執行,
  • 沒有寫入修改了桌,因爲SELECT結果集被緩存,
  • 各種限制(如你所說的)沒有超過。

注意Query cache efficiency: 5.9% - 質量控制不是很有用。我會爭辯說關閉它。 (如果低於70%,我會關閉它)。

在磁盤上創建tmp表不是世界的盡頭。

SHOW GLOBAL STATUS; 

然後Created_tmp_disk_tables/Uptime是資料性的。也許只有10%的服務器值爲零。 80%的值小於1 /秒。如何經常你在磁盤上創建tmp表?

大概mysqltuner正在計算這樣的:

Created_tmp_disk_tables/(Created_tmp_disk_tables + Created_tmp_tables) 

在這種情況下,我會同意,75%是真的很高。 2%是可取的。

Key buffer hit rate: 69.3%正在談論MyISAM索引。你在使用MyISAM還是InnoDB?如果您使用的是MyISAM,那麼key_buffer_size的值是多少?這可能是無關緊要的 - 爲管理目的有少量的MyISAM活動。

回到real問題 - 你想加快緩慢的查詢。讓我們看看可能會出現在磁盤上的一些查詢,以及SHOW CREATE TABLE。這可能是一些簡單的修復。

如果您想對設置進行更全面的分析,請提供機器可讀版本SHOW VARIABLES;SHOW GLOBAL STATUS;