mysql查詢緩存
Linux下查看mysql路徑 指令 ps -ef|grep mysql 得出結果 root 17659 1 0 2011 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/my...
B. MySQL怎麼禁止使用緩存以及復雜多表查詢的索引優化問題
1、query_cache_size=0 已經禁用了查詢緩存,但表數據可能緩存了,flush tables試試,不過操作系統還有一個硬碟緩存,想跟第一次查詢之前的狀態一致恐怕只能每次重啟
2、group by與order by不會用索引的,索引最大的用處就是減小磁碟IO,也就是where時盡量少磁碟IO並讀出所有滿足條件的記錄
C. mysql生產環境下到底需不需要開查詢緩存
開查詢緩存可以加快查詢速度,因為是把結果先放到了緩存中,存取會快
D. MYSQL會把查詢的結果緩存多久
設置好查詢緩存的大小就行了。比如設置個20MB. SET GLOBAL QUERY_CACHE_SIZE=20000000; mysql會將查詢SQL和結果集存到緩存中,等下次遇到相同的SQL語句時,結果集從緩存中讀齲 不設置就不用緩存了
E. mysql的緩存命中率為何為0解決方案
MySQL緩存命中率概述
工作原理:
查詢緩存的工作原理,基本上可以概括為: 緩存SELECT操作或預處理查詢(注釋:5.1.17開始支持)的結果集和SQL語句; 新的SELECT語句或預處理查詢語句,先去查詢緩存,判斷是否存在可用的記錄集,判斷標准:與緩存的SQL語句,是否完全一樣,區分大小寫;
查詢緩存對什麼樣的查詢語句,無法緩存其記錄集,大致有以下幾類:
1、 查詢語句中加了SQL_NO_CACHE參數;
2、查詢語句中含有獲得值的函數,包涵自定義函數,如:CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ等;
3、 對系統資料庫的查詢:mysql、information_schema 查詢語句中使用SESSION級別變數或存儲過程中的局部變數;
4、查詢語句中使用了LOCK IN SHARE MODE、FOR UPDATE的語句 查詢語句中類似SELECT …INTO 導出數據的語句;
5、對臨時表的查詢操作; 存在警告信息的查詢語句; 不涉及任何錶或視圖的查詢語句; 某用戶只有列級別許可權的查詢語句;
6、 事務隔離級別為:Serializable情況下,所有查詢語句都不能緩存;
提高緩存命中率的建議
利用緩存中的數據具有比較嚴格的條件。其實這些條件也是合情合理的。主要是為了保障數據的一致性。對以上這些條件有深入的認識之後,現在資料庫管理員需要考慮的是,如何來提高這個緩存的命中率?對此筆者有如下幾個建議。
一是在配置時,客戶端與伺服器端要使用相同的字元集。如果客戶端(或者說第三方工具)與伺服器端使用的字元集不同,那麼任何情況下都不會使用緩存功能。特別在國內,需要用到中文的字元集。此時特別需要注意,客戶端默認字元集要與伺服器端的默認字元集相同。注意,這里是相同,而不是兼容。有時候即使採用了不同的字元集,客戶端上仍然可以正常顯示。這主要是因為有些字元集雖然不相同,但是是相互兼容的。在緩存管理上,需要相同,光兼容還不行。
二是在客戶端上,要固化查詢的語句。如現在有財務人員和采購人員同時從系統中查詢11月份的出貨數據。顯然他們崗位職責不同,所需要欄位的內容是不同的。此時在客戶端出,可以允許用戶設置自己所需要的表單格式。但是筆者建議,後台所採用的SQL語句最好是相同的。這里數據會經過三個渠道:後台資料庫、客戶端、用戶。筆者的意識時,後台資料庫與客戶端之間的交互採用相同的SQL語句。然後客戶端與用戶之間進行交互時,根據用戶定義的格式(包括欄位前後的排列、不包括查詢條件語句的差異)向用戶顯示數據。此時由於採用了相同的SQL語句(只是用戶對於顯示格式的要求不同),從而可以提高應用系統的查詢效率。
三是提高內存中緩存的配置,來提高命中率。一般在伺服器啟動時,操作系統會跟資料庫軟體協商緩存空間的大小。當緩存工作不足時,緩存中最舊的緩存記錄會被最新的消息所覆蓋。可見,如果能夠提高緩存空間,就可以提高命中率。這就好像打靶,目標多了,命中的幾率也會高許多。不過用戶的並發數越多,這個設置的效果會越不明顯。
四是通過分區表可以提高緩存的命中率。在上面的條件分析中,大家可以看到,只要所查詢的表中插入了一條記錄,系統就會清空緩存記錄。現在以查詢出貨記錄為例。出貨記錄表每天都在更新,而用戶在年初時,會經常需要查詢上一年的出貨記錄。此時由於這個表中的數據每個小時都在更新,那麼緩存中的信息會不斷的被情況。此時緩存的命中率顯然不會很高。針對這種情況,筆者建議可以採用分區表。如可以通過系統設置,將2010年的出貨記錄單獨存放在一個出貨的分區表中。即每一個年度都使用一張單獨的分區表。此時2011年的紀錄,就不會影響到2010年的分區表。此時如果用戶重復查詢2010年的出貨信息,只要其使用的SQL語句相同(沒有採用不同的查詢條件),那麼就可以享受緩存機制所帶來的效益,提高應用系統的查詢效果。。
多個應用對緩存的影響
通常情況下,MySQL資料庫的緩存是根據伺服器內存的大小自動分配的。如果一台伺服器上只有一個MySQL應用,那麼固然最好。不過在實際工作中,為了降低信息化投資的成本,往往會在同一台伺服器上布置多個信息化應用。由於其他信息化應用也需要使用內存的空間作為緩存,那麼MySQL資料庫中緩存空間就可能變小。如果遇到這種情況下,資料庫管理員需要跟系統工程師進行協商,為各種不同的應用根據性能要求的不同,手工設置不同的緩存空間。如此的話,就可以避免同一台伺服器上不同信息化應用對緩存的沖突。
F. 如何清理MySQL 的查詢緩存
MySQL的FLUSH可以清理mysql資料庫緩存數據
MySQL的FLUSH句法(清除或者重新載入內部緩存) FLUSH flush_option [,flush_option],如果你想要清除一些MySQL使用內部緩存,你應該使用FLUSH命令。為了執行FLUSH,你必須有reload許可權。
flush_option 可以是下列任何東西:
HOSTS 這個用的最多,經常碰見。主要是用來清空主機緩存表。如果你的某些主機改變IP數字,或如果你得到錯誤消息Host ... isblocked,你應該清空主機表。當在連接MySQL伺服器時,對一台給定的主機有多於 max_connect_errors個錯誤連續不斷地發生,MySQL為了安全的需要將會阻止該主機進一步的連接請求。清空主機表允許主機再嘗試連接。
LOGS 關閉當前的二進制日誌文件並創建一個新文件,新的二進制日誌文件的名字在當前的二進制文件的編號上加1。
PRIVILEGES 這個也是經常使用的,每當重新賦權後,為了以防萬一,讓新許可權立即生效,一般都執行一把,目地是從資料庫授權表中重新裝載許可權到緩存中。
TABLES 關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。
FLUSH TABLES WITH READ LOCK 關閉所有打開的表,同時對於所有資料庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操作常常用於數據備份的時候。解鎖的語句就是unlock tables。
FLUSH TABLES WITH READ LOCK對於資料庫是全局的表鎖定,如果只想鎖定幾個表,可以用LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE} 。這個命令同樣需要unlock tables來解鎖。
read-lock: 允許其他並發的讀請求,但阻塞寫請求,即可以同時讀,但不允許任何寫。也叫共享鎖。write-lock: 不允許其他並發的讀和寫請求,是排他的(exclusive)。也叫獨占鎖
STATUS 重置大多數狀態變數到0。
MASTER 刪除所有的二進制日誌索引文件中的二進制日誌文件,重置二進制日誌文件的索引文件為空,創建一個新的二進制日誌文件,不過這個已經不推薦使用,改成reset master 了。可以想像,以前自己是多土啊,本來一條簡單的命令就可以搞定的,卻要好幾條命令來,以前的做法是先查出來當前的二進制日誌文件名,再用purge 操作。
QUERY CACHE 重整查詢緩存,消除其中的碎片,提高性能,但是並不影響查詢緩存中現有的數據,這點和Flush table 和Reset Query Cache(將會清空查詢緩存的內容)不一樣的。
SLAVE 類似於重置復制吧,讓從資料庫忘記主資料庫的復制位置,同時也會刪除已經下載下來的relay log,與Master一樣,已經不推薦使用,改成Reset Slave了。這個也很有用的。
一般來講,Flush操作都會記錄在二進制日誌文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不會記錄,因此上述操作如果記錄在二進制日誌文件中話,會對從資料庫造成影響。
G. mysql資料庫使用哪一關鍵字可以開啟查詢高速緩存
估計過使用的MySQL是可以開啟查詢高速黃村的