mysql一直copying to tmp table_mysql提示Copying to tmp table on disk
網(wǎng)站運(yùn)行的慢了,查找原因是Copying to tmp table on disk那怎么解決這個(gè)問題呢
解決一例最近常常碰到網(wǎng)站慢的情況,登陸到后臺(tái),查詢一下 /opt/mysql/bin/mysqladmin processlist;
發(fā)現(xiàn)一個(gè)查詢狀態(tài)為: Copying to tmp table 而且此查詢速度非常慢,基本一分鐘左右才出來,后面是很多查詢,狀態(tài)為lock。
此分析對(duì)我沒有太大的作用,因此用google查詢了一下,發(fā)現(xiàn)網(wǎng)上一篇文章講得很好: Copying to tmp table on disk The temporary result set was larger than tmp_table_size and the thread is now changing the in memory-based temporary table to a disk based one to save memory.
哦,原來是這樣的,如果查詢超出了tmp_table_size的限制,那么mysql用/tmp保存查詢結(jié)果,然后返回給客戶端。
set global tmp_table_size=209715200 (200M) 再次運(yùn)行此查詢,用/opt/mysql/bin/mysqladmin processlist;
進(jìn)行觀察,發(fā)現(xiàn)不會(huì)出現(xiàn)上述問題.
至此問題解決. 調(diào)節(jié)tmp_table_size 的時(shí)候發(fā)現(xiàn)另外一些參數(shù)
Qcache_queries_in_cache 在緩存中已注冊(cè)的查詢數(shù)目
Qcache_inserts 被加入到緩存中的查詢數(shù)目
Qcache_hits 緩存采樣數(shù)數(shù)目
Qcache_lowmem_prunes 因?yàn)槿鄙賰?nèi)存而被從緩存中刪除的查詢數(shù)目
Qcache_not_cached 沒有被緩存的查詢數(shù)目 (不能被緩存的,或由于 QUERY_CACHE_TYPE)
Qcache_free_memory 查詢緩存的空閑內(nèi)存總數(shù)
Qcache_free_blocks 查詢緩存中的空閑內(nèi)存塊的數(shù)目
Qcache_total_blocks 查詢緩存中的塊的總數(shù)目
Qcache_free_memory 可以緩存一些常用的查詢,如果是常用的sql會(huì)被裝載到內(nèi)存。那樣會(huì)增加數(shù)據(jù)庫(kù)訪問速度
在做mysql性能優(yōu)化時(shí),發(fā)現(xiàn)copying to tmp table on disk占用了很長(zhǎng)的執(zhí)行時(shí)間,如下性能分析圖:
上圖中的第一行顯示mysql向臨時(shí)表復(fù)制數(shù)據(jù)花費(fèi)了117毫秒的時(shí)間,這個(gè)必須想辦法優(yōu)化掉。
經(jīng)過查資料發(fā)現(xiàn)mysql可以通過變量tmp_table_size和max_heap_table_size來控制內(nèi)存表大小上限,如果超過上限會(huì)將數(shù)據(jù)寫到磁盤上,從而會(huì)有物理磁盤的讀寫操作,導(dǎo)致影響性能。
我們可以通過調(diào)整這兩個(gè)變量的值來提升性能(當(dāng)然前提條件是mysql所在服務(wù)器有足夠的內(nèi)存)。
首先可以通過下面語(yǔ)句查看當(dāng)前的變量值:
SHOW VARIABLES LIKE'max_heap_table_size%';
然后通過SET GLOBAL max_heap_table_size=522715200;?設(shè)置變量值為512M,你可以根據(jù)自己的情況設(shè)置合適的值;tmp_table_size變量的設(shè)置方法一樣。
在使用mysql是提醒mysql Copying to tmp table on disk 錯(cuò)誤了,下面我們來看看此問題的解決辦法.
經(jīng)過查資料發(fā)現(xiàn)mysql可以通過變量tmp_table_size和max_heap_table_size來控制內(nèi)存表大小上限,如果超過上限會(huì)將數(shù)據(jù)寫到磁盤上,從而會(huì)有物理磁盤的讀寫操作,導(dǎo)致影響性能.
我們可以通過調(diào)整這兩個(gè)變量的值來提升性能,當(dāng)然前提條件是mysql所在服務(wù)器有足夠的內(nèi)存.
首先可以通過下面語(yǔ)句查看當(dāng)前的變量值:
SHOW VARIABLES LIKE ‘max_heap_table_size%’;
然后通過SET GLOBAL max_heap_table_size=522715200; 設(shè)置變量值為512M,你可以根據(jù)自己的情況設(shè)置合適的值,tmp_table_size變量的設(shè)置方法一樣.
SHOW VARIABLES LIKE ‘tmp_table_size’;
SET GLOBAL max_heap_table_size=512*1024*1024;
其次發(fā)現(xiàn)開發(fā)人員編寫的語(yǔ)句,根本無法使用到緩存,這個(gè)sql優(yōu)化是個(gè)長(zhǎng)期的過程,代碼如下:
#?Time:?140901?16:26:23
#?User@Host:?wealth[wealth]?@?[172.20.1.70]
#?Query_time:?2266.887211?Lock_time:?0.000196?Rows_sent:?17?Rows_examined:?71501657
SET?timestamp=1409559983;
SELECT?a.Pid,count(a.id)ascount,p.ProductId,p.ProductName,p.ProductType,p.Profit,p.StartTime,p.EndTime,p.StartMoney,p.AddTime,i.IssuerName?FROM?`Issuer`asi,`Count`asa?left?join?Productasp?on?a.Pid=p.ProductId?WHERE?a.Stime?>?‘time()?–?3600*24*30′andp.IssuerId=i.IssuerId?AND?p.IsDel=0?group?by?a.Pid?order?bycount(a.id)?desc?limit?0,17;
總結(jié)
以上是生活随笔為你收集整理的mysql一直copying to tmp table_mysql提示Copying to tmp table on disk的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 土耳其股市熔断 到底是发生了什么事
- 下一篇: 导出远程mysql数据库中的表_shel