刪除數(shù)據(jù)必然會在數(shù)據(jù)文件中造成不連續(xù)的空白空間,而當(dāng)插入數(shù)據(jù)時,這些空白空間則會被利用起來.于是造成了數(shù)據(jù)的存儲位置不連續(xù),以及物理存儲順序與理論上的排序順序不同,這種是數(shù)據(jù)碎片.實際上數(shù)據(jù)碎片分為兩種,一種是單行數(shù)據(jù)碎片,另一種是多行數(shù)據(jù)碎片.前者的意思就是一行數(shù)據(jù),被分成N個片段,存儲在N個位置.后者的就是多行數(shù)據(jù)并未按照邏輯上的順序排列.當(dāng)有大量的刪除和插入操作時,必然會產(chǎn)生很多未使用的空白空間,這些空間就是多出來的額外空間.索引也是文件數(shù)據(jù),所以也會產(chǎn)生索引碎片,理由同上,大概就是順序紊亂的問題.Engine 不同,OPTIMIZE 的操作也不一樣的,MyISAM 因為索引和數(shù)據(jù)是分開的,所以 OPTIMIZE 可以整理數(shù)據(jù)文件,并重排索引。這樣不但會浪費空間,并且查詢速度也更慢。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、網(wǎng)站頁面設(shè)計、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站建設(shè)公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗,以探求精品塑造與理念升華,設(shè)計最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅持講誠信,負(fù)責(zé)任的原則,為您進行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場環(huán)境中,互促共生。
查看碎片信息:
Index_length 代表索引的總量
Data_free 代表碎片數(shù)量
從information_schema中獲取信息:
碎片整理:
過程時間長短取決于表大小和碎片多少,
返回結(jié)果optimize status OK則整理完成;
mysql 開啟查詢緩存可以有兩種方法來開啟一種是使用set命令來進行開啟,另一種是直接修改my.ini文件來直接設(shè)置都是非常的簡單的哦。
開啟緩存,設(shè)置緩存大小,具體實施如下:
windows下是my.ini,linux下是my.cnf;
在配置文件的最后追加上:
需要重啟mysql生效;
b) 開啟緩存,兩種方式:
a)使用mysql命令:
如果報錯:
Query cache is disabled; restart the server with query_cache_type=1 to enable it,還是老老實實的該配置文件,然后重啟吧,原因如下:
查看是否設(shè)置成功
show variables like "%query_cache%" 查看是否設(shè)置成功:
當(dāng)然如果你的數(shù)據(jù)表有更新怎么辦,沒關(guān)系mysql默認(rèn)會和這個表有關(guān)系的緩存刪掉,下次查詢的時候會直接讀表然后再緩存
下面是一個簡單的例子:
以上的相關(guān)內(nèi)容就是對mysql緩存查詢和設(shè)置的介紹,望你能有所收獲。
一般,我們會把 query_cache_type 設(shè)置為 ON,默認(rèn)情況下應(yīng)該是ON
query_cache_type有3個值 0代表關(guān)閉查詢緩存OFF,1代表開啟ON,2(DEMAND)代表當(dāng)sql語句中有SQL_CACHE關(guān)鍵詞時才緩存,如:
這樣 當(dāng)我們執(zhí)行 select id,name from tableName; 這樣就會用到查詢緩存。
①在 query_cache_type 打開的情況下,如果你不想使用緩存,需要指明
select sql_no_cache id,name from tableName;
②當(dāng)sql中用到mysql函數(shù),也不會緩存
當(dāng)然也可以禁用查詢緩存: mysql set session query_cache_type=off;
上面的顯示,表示設(shè)置查詢緩存是可用的。
表示查詢緩存大小,也就是分配內(nèi)存大小給查詢緩存,如果你分配大小為0,
那么 第一步 和 第二步 起不到作用,還是沒有任何效果。
上面是 mysql6.0設(shè)置默認(rèn)的,之前的版本好像默認(rèn)是0的,那么就要自己設(shè)置下。
設(shè)置
這里是設(shè)置1M左右,900多K。
再次查看下:
顯示我們設(shè)置新的大小,表示設(shè)置成功。
例如: 如果查詢結(jié)果很大, 也緩存????這個明顯是不可能的。
MySql 可以設(shè)置一個最大的緩存值,當(dāng)你查詢緩存數(shù)結(jié)果數(shù)據(jù)超過這個值就不會
進行緩存。缺省為1M,也就是超過了1M查詢結(jié)果就不會緩存。
這個是默認(rèn)的數(shù)值,如果需要修改,就像設(shè)置緩存大小一樣設(shè)置,使用set
重新指定大小。
好了,通過4個步驟就可以 打開了查詢緩存,具體值的大小和查詢的方式 這個因不同
的情況來指定了。
mysql查詢緩存相關(guān)變量
MySQL 提供了一系列的 Global Status 來記錄 Query Cache 的當(dāng)前狀態(tài),具體如下:
Qcache_free_blocks:目前還處于空閑狀態(tài)的 Query Cache 中內(nèi)存 Block 數(shù)目
Qcache_free_memory:目前還處于空閑狀態(tài)的 Query Cache 內(nèi)存總量
Qcache_hits:Query Cache 命中次數(shù)
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數(shù),也就是沒有命中的次數(shù)
Qcache_lowmem_prunes:當(dāng) Query Cache 內(nèi)存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對象使用的次數(shù)
Qcache_not_cached:沒有被 Cache 的 SQL 數(shù),包括無法被 Cache 的 SQL 以及由于 query_cache_type 設(shè)置的不會被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數(shù)量
Qcache_total_blocks:Query Cache 中總的 Block 數(shù)量
檢查是否從查詢緩存中受益的最簡單的辦法就是檢查緩存命中率
當(dāng)服務(wù)器收到SELECT 語句的時候,Qcache_hits 和Com_select 這兩個變量會根據(jù)查詢緩存
的情況進行遞增
查詢緩存命中率的計算公式是:Qcache_hits/(Qcache_hits + Com_select)。
query_cache_min_res_unit的配置是一柄”雙刃劍”,默認(rèn)是4KB,設(shè)置值大對大數(shù)據(jù)查詢有好處,但如果你的查詢都是小數(shù)據(jù) 查詢,就容易造成內(nèi)存碎片和浪費。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數(shù)據(jù)量的話。
查詢緩存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說明query_cache_size設(shè)置的過大,可適當(dāng)減小;查詢緩存利用率在80%以上而且 Qcache_lowmem_prunes 50的話說明query_cache_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
示例服務(wù)器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
查詢緩存可以看做是SQL文本和查詢結(jié)果的映射。如果第二次查詢的SQL和第一次查詢的SQL完全相同(注意必須是完全相同,即使多一個空格或者大小寫不同都認(rèn)為不同)且開啟了查詢緩存,那么第二次查詢就直接從查詢緩存中取結(jié)果,可以通過下面的SQL來查看緩存命中次數(shù)(是個累加值):
另外即使完全相同的SQL,如果使用不同的字符集、不同的協(xié)議等也會被認(rèn)為是不同的查詢而分別進行緩存。
在表的結(jié)構(gòu)或數(shù)據(jù)發(fā)生改變時,查詢緩存中的數(shù)據(jù)不再有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會導(dǎo)致緩存數(shù)據(jù)失效。所以查詢緩存適合有大量相同查詢的應(yīng)用,不適合有大量數(shù)據(jù)更新的應(yīng)用。
可以使用下面三個SQL來清理查詢緩存:
1、FLUSH QUERY CACHE; // 清理查詢緩存內(nèi)存碎片。
2、RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
3、FLUSH TABLES; //關(guān)閉所有打開的表,同時該操作將會清空查詢緩存中的內(nèi)容。
Query Cache是MySQL Server層的一個非常好的特性,對于小數(shù)據(jù)集或訪問量非常集中的應(yīng)用場景,有非常好的性能提升,但是Query Cache引入了一些新的問題,而且大部分場景下比較雞肋,官方打算棄用了
參考:
可以看到,當(dāng)前表的碎片率超高了,50.6%。
有三種辦法整理碎片
這三種操作都是先創(chuàng)建一個臨時表復(fù)制完成后再刪除舊表,所以在執(zhí)行操作的過程中磁盤會先增大。
會鎖表
會鎖表
pt-online-schema-change - ALTER tables 無需鎖表。
整理結(jié)果很明顯,整理后碎片率0.3%。
這里有幾個參數(shù)需要介紹一下:
--dry-run
這個參數(shù)不建立觸發(fā)器,不拷貝數(shù)據(jù),也不會替換原表。只是創(chuàng)建和更改新表。
--execute
表明你已經(jīng)閱讀了文檔,并且確認(rèn)要 alter the table。你必須配置這個參數(shù)來 alter the table。如果你不配置,那么工具將只進行一些安全檢查然后就退出了。這幫助確保你已經(jīng)閱讀了文檔,并且了解如何使用該工具。如果你沒有閱讀這些文檔,那么不會設(shè)置該參數(shù)。
--critical-load
每次chunk操作前后,會根據(jù)show global status統(tǒng)計指定的狀態(tài)量的變化,默認(rèn)是統(tǒng)計Thread_running。目的是為了安全,防止原始表上的觸發(fā)器引起負(fù)載過高。這也是為了防止在線DDL對線上的影響。超過設(shè)置的閥值,就會終止操作,在線DDL就會中斷。提示的異常如上報錯信息。
--max-lag
type: time; default: 1s
lag 滯后偏移
暫停數(shù)據(jù)拷貝,直到所有replicas的lag值低于該值。在每個 data-copy query (each chunk)后,工具會通過Seconds_Behind_Master查詢所有replica的 replication lag 。如果任何replica lag大于該值,那么工具會sleep --check-interval 秒,然后再次檢查所有replica。如果你指定 --check-slave-lag ,那么工具會檢查那臺server,而不是所有server。如果你想控制哪個提供工具的監(jiān)控,配置DSN值 --recursion-method 。
工具會等待直到replicas停止lagging。如果任一replica停止,工具會一直處于等待狀態(tài)直到該replica啟動。 在所有replicas運行并且lagging不大的情況下,數(shù)據(jù)拷貝繼續(xù)。
工具在等待的時候,會打印進程報告。如果replica停止了,會立即打印進程報告,然后在每個進程報告期間重復(fù)。
--check-interval
type: time; default: 1
Sleep time between checks for --max-lag .
--max-load
選項定義一個閥值,在每次chunk操作后,查看show global status狀態(tài)值是否高于指定的閥值。該參數(shù)接受一個mysql status狀態(tài)變量以及一個閥值,如果沒有給定閥值,則定義一個閥值為為高于當(dāng)前值的20%。注意這個參數(shù)不會像--critical-load終止操作,而只是暫停操作。當(dāng)status值低于閥值時,則繼續(xù)往下操作。是暫停還是終止操作這是--max-load和--critical-load的差別。
--charset
簡寫: -A; type: string
設(shè)置默認(rèn)字符集。如果值為 utf8,設(shè)置 Perl’s binmode on STDOUT to utf8,傳送 mysql_enable_utf8 參數(shù)到 DBD::mysql,然后在連接到MySQL后運行 SET NAMES UTF8 。其他的值也是在STDOUT設(shè)置 binmode,然后在連到MySQL后運行 SET NAMES 。
--check-replication-filters
檢查復(fù)制中是否設(shè)置了過濾條件,如果設(shè)置了,程序?qū)⑼顺?/p>
--nocheck-replication-filters
不檢查復(fù)制中是否設(shè)置了過濾條件
--set-vars
設(shè)置mysql的變量值
--check-slave-lag
檢查主從延遲
--no-version-check
不檢查版本,在阿里云服務(wù)器中一般加入此參數(shù),否則會報錯
1、打開mysql的客戶端 這里使用navicat,連接數(shù)據(jù)庫,等到navicat主頁面,雙擊需要操作的數(shù)據(jù)庫連接。
2、登錄到數(shù)據(jù)庫主頁面后,點擊左側(cè)的數(shù)據(jù)庫連接,打開數(shù)據(jù)庫,可以看到可以操作的所有數(shù)據(jù)庫。
3、這時有有兩個數(shù)據(jù)庫,目標(biāo)是將數(shù)據(jù)1的所有數(shù)據(jù)同步到數(shù)據(jù)庫2上,需要點擊主頁面上的。
4、打開工具菜單,選擇數(shù)據(jù)庫同步菜單,彈出數(shù)據(jù)同步的對話框,可以選擇數(shù)據(jù)源,目標(biāo)數(shù)據(jù)庫。
5、選擇數(shù)據(jù)庫源和需要操作的數(shù)據(jù)庫后,然后在選擇目標(biāo)數(shù)據(jù)庫連接,目標(biāo)數(shù)據(jù)庫,然后在選擇需要操作的表,點擊開始即可。
分享文章:mysql怎么清理碎片,mysql清理碎片腳本
瀏覽路徑:http://jinyejixie.com/article16/dssdcdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、App開發(fā)、電子商務(wù)、面包屑導(dǎo)航、營銷型網(wǎng)站建設(shè)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)