mysql 開啟查詢緩存可以有兩種方法來開啟一種是使用set命令來進行開啟,另一種是直接修改my.ini文件來直接設置都是非常的簡單的哦。
公司主營業務:成都做網站、網站制作、成都外貿網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。成都創新互聯公司是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創新互聯公司推出普陀免費做網站回饋大家。
開啟緩存,設置緩存大小,具體實施如下:
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,還是老老實實的該配置文件,然后重啟吧,原因如下:
查看是否設置成功
show variables like "%query_cache%" 查看是否設置成功:
當然如果你的數據表有更新怎么辦,沒關系mysql默認會和這個表有關系的緩存刪掉,下次查詢的時候會直接讀表然后再緩存
下面是一個簡單的例子:
以上的相關內容就是對mysql緩存查詢和設置的介紹,望你能有所收獲。
一般,我們會把 query_cache_type 設置為 ON,默認情況下應該是ON
query_cache_type有3個值 0代表關閉查詢緩存OFF,1代表開啟ON,2(DEMAND)代表當sql語句中有SQL_CACHE關鍵詞時才緩存,如:
這樣 當我們執行 select id,name from tableName; 這樣就會用到查詢緩存。
①在 query_cache_type 打開的情況下,如果你不想使用緩存,需要指明
select sql_no_cache id,name from tableName;
②當sql中用到mysql函數,也不會緩存
當然也可以禁用查詢緩存: mysql set session query_cache_type=off;
上面的顯示,表示設置查詢緩存是可用的。
表示查詢緩存大小,也就是分配內存大小給查詢緩存,如果你分配大小為0,
那么 第一步 和 第二步 起不到作用,還是沒有任何效果。
上面是 mysql6.0設置默認的,之前的版本好像默認是0的,那么就要自己設置下。
設置
這里是設置1M左右,900多K。
再次查看下:
顯示我們設置新的大小,表示設置成功。
例如: 如果查詢結果很大, 也緩存????這個明顯是不可能的。
MySql 可以設置一個最大的緩存值,當你查詢緩存數結果數據超過這個值就不會
進行緩存。缺省為1M,也就是超過了1M查詢結果就不會緩存。
這個是默認的數值,如果需要修改,就像設置緩存大小一樣設置,使用set
重新指定大小。
好了,通過4個步驟就可以 打開了查詢緩存,具體值的大小和查詢的方式 這個因不同
的情況來指定了。
mysql查詢緩存相關變量
MySQL 提供了一系列的 Global Status 來記錄 Query Cache 的當前狀態,具體如下:
Qcache_free_blocks:目前還處于空閑狀態的 Query Cache 中內存 Block 數目
Qcache_free_memory:目前還處于空閑狀態的 Query Cache 內存總量
Qcache_hits:Query Cache 命中次數
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,也就是沒有命中的次數
Qcache_lowmem_prunes:當 Query Cache 內存容量不夠,需要從中刪除老的 Query Cache 以給新的 Cache 對象使用的次數
Qcache_not_cached:沒有被 Cache 的 SQL 數,包括無法被 Cache 的 SQL 以及由于 query_cache_type 設置的不會被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 數量
Qcache_total_blocks:Query Cache 中總的 Block 數量
檢查是否從查詢緩存中受益的最簡單的辦法就是檢查緩存命中率
當服務器收到SELECT 語句的時候,Qcache_hits 和Com_select 這兩個變量會根據查詢緩存
的情況進行遞增
查詢緩存命中率的計算公式是:Qcache_hits/(Qcache_hits + Com_select)。
query_cache_min_res_unit的配置是一柄”雙刃劍”,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據 查詢,就容易造成內存碎片和浪費。
查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數據量的話。
查詢緩存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說明query_cache_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且 Qcache_lowmem_prunes 50的話說明query_cache_size可能有點小,要不就是碎片太多。
查詢緩存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%
示例服務器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
查詢緩存可以看做是SQL文本和查詢結果的映射。如果第二次查詢的SQL和第一次查詢的SQL完全相同(注意必須是完全相同,即使多一個空格或者大小寫不同都認為不同)且開啟了查詢緩存,那么第二次查詢就直接從查詢緩存中取結果,可以通過下面的SQL來查看緩存命中次數(是個累加值):
另外即使完全相同的SQL,如果使用不同的字符集、不同的協議等也會被認為是不同的查詢而分別進行緩存。
在表的結構或數據發生改變時,查詢緩存中的數據不再有效。有這些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE會導致緩存數據失效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
可以使用下面三個SQL來清理查詢緩存:
1、FLUSH QUERY CACHE; // 清理查詢緩存內存碎片。
2、RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
3、FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。
Query Cache是MySQL Server層的一個非常好的特性,對于小數據集或訪問量非常集中的應用場景,有非常好的性能提升,但是Query Cache引入了一些新的問題,而且大部分場景下比較雞肋,官方打算棄用了
參考:
把數據備份到另一張表
然后TRUNCATE TABLE
再把備份的數據插入回來 where條件過濾掉想刪的數據
然后drop 備份表
最近遇到了一個坑,MySQL數據庫服務器硬盤容量告警,而且因為非技術原因,還不能追加硬盤。
通過監控發現,磁盤IO一直100%。直接影響就是系統處理時間越來越長,接口響應耗時也越來越多。
經過分析,發現mysql業務數據庫里有好幾張大表,而且這幾張大表行數都在5000萬以上,文件大小都在100G和150G之間。
因為這些表都是備份表,第一反應就是找DBA直接清理掉這些表。 潛意識里以為drop table 和 truncate table效率很高,都會快速完成,但事實上不是。 但意外的是,在執行drop table時,直接導致數據庫掛起了,而且還發生了主從切換。
第一次嘗試失敗。
第一次失敗反應出來的問題是,如果數據文件過大,drop table操作也得慎用。
那我們可以在drop table之前,想辦法把數據文件邏輯清空。比如Linux硬連接的方式,具體步驟如下(假如目標表名是test):
ln test.ibd test.ibd.hdlk
drop table test;
此時,磁盤上真實的數據其實沒刪除,但數據庫里的表,已經刪除了。
rm test.ibd.hdlk
到此,數據就能快速清理成功了。
字符串或串(String)是由零個或多個字符組成的有限序列。一般記為 s='a1a2???an'(n=0)。它是編程語言中表示文本的數據類型。
通常以串的整體作為操作對象,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及刪除一個子串等。兩個字符串相等的充要條件是:長 度相等,并且各個對應位置上的字符都相等。設p、q是兩個串,求q在p中首次出現的位置的運算叫做模式匹配。串的兩種最基本的存儲方式是順序存儲方式和鏈 接存儲方式。
下面我們來看看MySQL中的字符串函數
假如結果的長度大于 max_allowed_packet 系統變量的最大值時,字符串值函數的返回值為NULL。
對于在字符串位置操作的函數,第一個位置的編號為 1。
◆ ASCII(str)
返回值為字符串str 的最左字符的數值。假如str為空字符串,則返回值為 0 。假如str 為NULL,則返回值為 NULL。 ASCII()用于帶有從 0到255的數值的字符。
mysql SELECT ASCII('2');
- 50
mysql SELECT ASCII(2);
- 50
mysql SELECT ASCII('dx');
- 100
見 ORD()函數。
◆ BIN(N)
返回值為N的二進制值的字符串表示,其中 N 為一個longlong (BIGINT) 數字。這等同于 CONV(N,10,2)。假如N 為NULL,則返回值為 NULL。
mysql SELECT BIN(12);
- '1100'
◆ BIT_LENGTH(str)
返回值為二進制的字符串str 長度。
mysql SELECT BIT_LENGTH('text');
- 32
◆ CHAR(N,... [USING charset])
CHAR()將每個參數N理解為一個整數,其返回值為一個包含這些整數的代碼值所給出的字符的字符串。NULL值被省略。
mysql SELECT CHAR(77,121,83,81,'76');
- 'MySQL'
mysql SELECT CHAR(77,77.3,'77.3');
- 'MMM'
大于 255的CHAR()參數被轉換為多結果字符。 例如,CHAR(256) 相當于 CHAR(1,0), 而CHAR(256*256) 則相當于 CHAR(1,0,0):
mysql SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
+----------------+----------------+
| HEX(CHAR(1,0)) | HEX(CHAR(256)) |
+----------------+----------------+
| 0100 | 0100 |
+----------------+----------------+
mysql SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
+------------------+--------------------+
| HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |
+------------------+--------------------+
| 010000 | 010000 |
+------------------+--------------------+
CHAR()的返回值為一個二進制字符串。可選擇使用USING語句產生一個給出的字符集中的字符串:
mysql SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
mysql SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
+---------------------+--------------------------------+
| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |
+---------------------+--------------------------------+
| binary| utf8 |
+---------------------+--------------------------------+
如果 USING已經產生,而結果字符串不符合給出的字符集,則會發出警告。同樣,如果嚴格的SQL模式被激活,則CHAR()的結果會成為 NULL。
◆ CHAR_LENGTH(str)
返回值為字符串str 的長度,長度的單位為字符。一個多字節字符算作一個單字符。對于一個包含五個二字節字符集, LENGTH()返回值為 10, 而CHAR_LENGTH()的返回值為5。
◆ CHARACTER_LENGTH(str)
CHARACTER_LENGTH()是CHAR_LENGTH()的同義詞。
◆ COMPRESS(string_to_compress)
壓縮一個字符串。這個函數要求 MySQL已經用一個諸如zlib的壓縮庫壓縮過。 否則,返回值始終是NULL。UNCOMPRESS() 可將壓縮過的字符串進行解壓縮。
mysql SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
- 21
mysql SELECT LENGTH(COMPRESS(''));
- 0
mysql SELECT LENGTH(COMPRESS('a'));
- 13
mysql SELECT LENGTH(COMPRESS(REPEAT('a',16)));
- 15
壓縮后的字符串的內容按照以下方式存儲:
空字符串按照空字符串存儲。
非空字符串未壓縮字符串的四字節長度進行存儲(首先為低字節),后面是壓縮字符串。如果字符串以空格結尾,就會在后加一個"."號,以防止當結果值是存儲 在CHAR或VARCHAR類型的字段列時,出現自動把結尾空格去掉的現象。(不推薦使用 CHAR 或VARCHAR 來存儲壓縮字符串。最好使用一個 BLOB 列代替)。
◆ CONCAT(str1,str2,...)
返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。或許有一個或多個參數。如果所有參數均為非二進制字符串,則結果為非二進制字符串。如果自變量中含有任一二進制字符串,則結果為一個二進制字符 串。一個數字參數被轉化為與之相等的二進制字符串格式;若要避免這種情況,可使用顯式類型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql SELECT CONCAT('My', 'S', 'QL');
- 'MySQL'
mysql SELECT CONCAT('My', NULL, 'QL');
- NULL
mysql SELECT CONCAT(14.3);- '14.3'
◆ CONCAT_WS(separator,str1,str2,...)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一個參數是其它參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參 數。如果分隔符為 NULL,則結果為 NULL。函數會忽略任何分隔符參數后的 NULL 值。
mysql SELECT CONCAT_WS(',','First name','Second name','Last Name');
- 'First name,Second name,Last Name'
mysql SELECT CONCAT_WS(',','First name',NULL,'Last Name');
- 'First name,Last Name'
CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。
◆ CONV(N,from_base,to_base)
不同數基間轉換數字。返回值為數字的N字符串表示,由from_base基轉化為 to_base 基。如有任意一個參數為NULL,則返回值為 NULL。自變量 N 被理解為一個整數,但是可以被指定為一個整數或字符串。最小基數為 2 ,而最大基數則為 36。 If to_base 是一個負數,則 N 被看作一個帶符號數。否則, N 被看作無符號數。 CONV() 的運行精確度為 64比特。
mysql SELECT CONV('a',16,2);
- '1010'
mysql SELECT CONV('6E',18,8);
- '172'
mysql SELECT CONV(-17,10,-18);
- '-H'
mysql SELECT CONV(10+'10'+'10'+0xa,10,10);
- '40'
◆ ELT(N,str1,str2,str3,...)
若N = 1,則返回值為 str1 ,若N = 2,則返回值為 str2 ,以此類推。若N 小于1或大于參數的數目,則返回值為 NULL 。 ELT() 是 FIELD()的補數。
mysql SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
- 'ej'
mysql SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
- 'foo'
◆ EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
返回值為一個字符串,其中對于bits值中的每個位組,可以得到一個 on 字符串,而對于每個清零比特位,可以得到一個off 字符串。bits 中的比特值按照從右到左的順序接受檢驗 (由低位比特到高位比特)。字符串被分隔字符串分開(默認為逗號‘,’),按照從左到右的順序被添加到結果中。number_of_bits 會給出被檢驗的二進制位數 (默認為 64)。
mysql SELECT EXPORT_SET(5,'Y','N',',',4);
- 'Y,N,Y,N'
mysql SELECT EXPORT_SET(6,'1','0',',',10);
- '0,1,1,0,0,0,0,0,0,0'
◆ FIELD(str,str1,str2,str3,...)
返回值為str1, str2, str3,……列表中的str 指數。在找不到str 的情況下,返回值為 0 。
如果所有對于FIELD() 的參數均為字符串,則所有參數均按照字符串進行比較。如果所有的參數均為數字,則按照數字進行比較。否則,參數按照雙倍進行比較。
如果str 為NULL,則返回值為0 ,原因是NULL不能同任何值進行同等比較。FIELD() 是ELT()的補數。
mysql SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
- 2
mysql SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
- 0
◆ FIND_IN_SET(str,strlist)
假如字符串str 在由N 子鏈組成的字符串列表strlist 中, 則返回值的范圍在 1 到 N 之間。一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。如果第一個參數是一個常數字符串,而第二個是type SET列,則 FIND_IN_SET() 函數被優化,使用比特計算。如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。 這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。
mysql SELECT FIND_IN_SET('b','a,b,c,d');
- 2
◆ FORMAT(X,D)
將number X設置為格式 '#,###,###.##', 以四舍五入的方式保留到小數點后D位, 而返回結果為一個字符串。
◆ HEX(N_or_S)
如果N_OR_S 是一個數字,則返回一個 十六進制值 N 的字符串表示,在這里, N 是一個longlong (BIGINT)數。這相當于 CONV(N,10,16)。
如果N_OR_S 是一個字符串,則返回值為一個N_OR_S的十六進制字符串表示, 其中每個N_OR_S 里的每個字符被轉化為兩個十六進制數字。
mysql SELECT HEX(255);
- 'FF'
mysql SELECT 0x616263;
- 'abc'
mysql SELECT HEX('abc');
- 616263
◆ INSERT(str,pos,len,newstr)
返回字符串 str, 其子字符串起始于 pos 位置和長期被字符串 newstr取代的len 字符。 如果pos 超過字符串長度,則返回值為原始字符串。假如len的長度大于其它字符串的長度,則從位置pos開始替換。若任何一個參數為null,則返回值為 NULL。
mysql SELECT INSERT('Quadratic', 3, 4, 'What');
- 'QuWhattic'
mysql SELECT INSERT('Quadratic', -1, 4, 'What');
- 'Quadratic'
mysql SELECT INSERT('Quadratic', 3, 100, 'What');
- 'QuWhat'
這個函數支持多字節字元。
◆ INSTR(str,substr)
返回字符串 str 中子字符串的第一個出現位置。這和LOCATE()的雙參數形式相同,除非參數的順序被顛倒。
mysql SELECT INSTR('foobarbar', 'bar');
- 4
mysql SELECT INSTR('xbar', 'foobar');
- 0
這個函數支持多字節字元,并且只有當至少有一個參數是二進制字符串時區分大小寫。
◆ LCASE(str)
LCASE() 是 LOWER()的同義詞。◆ LEFT(str,len)
返回從字符串str 開始的len 最左字符。
mysql SELECT LEFT('foobarbar', 5);
- 'fooba'
◆ LENGTH(str)
返回值為字符串str 的長度,單位為字節。一個多字節字符算作多字節。這意味著 對于一個包含5個2字節字符的字符串, LENGTH() 的返回值為 10, 而 CHAR_LENGTH()的返回值則為5。
mysql SELECT LENGTH('text');
- 4
◆ LOAD_FILE(file_name)
讀取文件并將這一文件按照字符串的格式返回。 文件的位置必須在服務器上,你必須為文件制定路徑全名,而且你還必須擁有FILE 特許權。文件必須可讀取,文件容量必須小于 max_allowed_packet字節。
若文件不存在,或因不滿足上述條件而不能被讀取, 則函數返回值為 NULL。
mysql UPDATE tbl_name
SET blob_column=LOAD_FILE('/tmp/picture')
WHERE id=1;
◆ LOCATE(substr,str) , LOCATE(substr,str,pos)
第一個語法返回字符串 str中子字符串substr的第一個出現位置。第二個語法返回字符串 str中子字符串substr的第一個出現位置, 起始位置在pos。如若substr 不在str中,則返回值為0。
mysql SELECT LOCATE('bar', 'foobarbar');
- 4
mysql SELECT LOCATE('xbar', 'foobar');
- 0
mysql SELECT LOCATE('bar', 'foobarbar',5);
- 7
這個函數支持多字節字元,并且只有當至少有一個參數是二進制字符串時區分大小寫。
使用
unbuffered
cursor
可以避免內存問題。
cursor
默認使用
buffered
模式。這種模式會把所有結果集返回并載入內存。如果結果集很大的話,內存會爆。
unbuffered
cursor
是每次只將下一行結果返回,內存占用很小。不過這種模式缺點很多,所以沒有作為默認的模式。
這是因為刪除操作后在數據文件中留下碎片所致。DELETE只是將數據標識位刪除,并沒有整理數據文件,當插入新數據后,會再次使用這些被置為刪除標識的記錄空間。另外實際操作過程中還發現這個問題還存在兩種情況。
(1)當DELETE后面跟條件的時候,則就會出現這個問題。如:
delete from table_name where 條件
刪除數據后,數據表占用的空間大小不會變。
(2)不跟條件直接delete的時候。如:
delete from table_name
清除了數據,同時數據表的空間也會變為0。
這就存在了一個問題,在網站的實際運行過程中。經常會存在這樣的附帶條件刪除數據的操作行為。天長日久,這不就在數據庫中浪費了很多的空間嗎。這個時候我們該使用 OPTIMIZE TABLE 指令對表進行優化了。
如何使用 OPTIMIZE 以及在什么時候該使用 OPTIMIZE 指令呢?
命令語法:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
最簡單的:optimize table phpernote_article;
如果您已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了很多更改,則應使用
OPTIMIZE TABLE。被刪除的記錄被保持在鏈接清單中,后續的INSERT操作會重新使用舊的記錄位置。您可以使用OPTIMIZE
TABLE來重新 利用未使用的空間,并整理數據文件的碎片。
在多數的設置中,您根本不需要運行OPTIMIZE TABLE。即使您對可變長度的行進行了大量的更新,您也不需要經常運行,每周一次或每月一次即可,只對特定的表運行。
OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用。
注意,在OPTIMIZE TABLE運行過程中,MySQL會鎖定表。因此,這個操作一定要在網站訪問量較少的時間段進行。
TRUNCATE
其語法結構為:
TRUNCATE [TABLE] tbl_name
這里簡單的給出個示例,
我想刪除 friends 表中所有的記錄,可以使用如下語句:
truncate table friends;
delete的效果有點像將mysql表中所有記錄一條一條刪除到刪完,而truncate相當于保留mysql表的結構,重新創建了這個表,所有的狀態都相當于新表,這樣空間就減下來了。
好了,當然對于我們網站不可能使用truncate table來清除了,因這樣之后所有數據都丟失了,這樣肯定是不合理的清除了,我們必須使用delete來刪除,然后再來修復優化表了哦。
分享名稱:mysql容量怎么刪除 mysql大數據量刪除
網址分享:http://m.newbst.com/article46/hjheeg.html
成都網站建設公司_創新互聯,為您提供軟件開發、網頁設計公司、網站收錄、外貿建站、建站公司、ChatGPT
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯