最近在生成環(huán)境下的mysql運(yùn)行下降,有些sql執(zhí)行也慢,首先檢查下慢查詢?nèi)罩臼欠耖_啟
show variables like ‘slow_query_log%’
在看慢日志設(shè)置的時(shí)間
show variables like ‘long_query_time%’;
可以看到開啟了慢查詢,find / -name slow-query.log查找慢日志
發(fā)現(xiàn)里面的sql是很慢但是都走了索引但是這些慢的sql都指向一兩個(gè)表。所以想到可能是每次備份對(duì)這幾個(gè)表的刪除操作,但是沒有進(jìn)行碎片整理
進(jìn)行下碎片整理,按表的引擎來處理
Myisam清理碎片
OPTIMIZE TABLE table_name、
InnoDB碎片清理
看到這段話
if you frequently delete rows (or update rows with variable-length data types), you can end up with a lot of wasted space in your data file(s), similar to filesystem fragmentation.
If you’re not using the innodb_file_per_table option, the only thing you can do about it is export and import the database, a time-and-disk-intensive procedure.
But if you are using innodb_file_per_table, you can identify and reclaim this space!
Prior to 5.1.21, the free space counter is available from the table_comment column of information_schema.tables. Here is some SQL to identify tables with at least 100M (actually 97.65M) of free space:
SELECT table_schema, table_name, table_comment FROM information_schema.tables WHERE engine LIKE ‘InnoDB’ AND table_comment RLIKE ‘InnoDB free: ([0-9]{6,}).*’;
Starting with 5.1.21, this was moved to the data_free column (a much more appropriate place):
SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB FROM information_schema.tables WHERE engine LIKE ‘InnoDB’ AND data_free > 100*1024*1024;
You can reclaim the lost space by rebuilding the table. The best way to do this is using ‘alter table’ without actually changing anything:
ALTER TABLE foo ENGINE=InnoDB;
This is what MySQL does behind the scenes if you run ‘optimize table’ on an InnoDB table. It will result in a read lock, but not a full table lock. How long it takes is completely dependent on the amount of data in the table (but not the size of the data file). If you have a table with a high volume of deletes or updates, you may want to run this monthly, or even weekly.
所以先進(jìn)行分析,語句如下
SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB FROM information_schema.tables WHERE engine LIKE ‘InnoDB’ AND data_free > 100*1024*1024;
返回了兩個(gè)數(shù)據(jù),正是那兩張表得data_free大于100M,所以ALTER TABLE tablename ENGINE=InnoDB;
相當(dāng)于重建表引擎了。再執(zhí)行速度正常了。
這里要提下如果一個(gè)表的表數(shù)據(jù)大小和索引大小與實(shí)際的表數(shù)據(jù)不符也需要清理下表碎片
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com