本文目錄一覽:
如何清理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不會記錄,因此上述操作如果記錄在二進制日誌文件中話,會對從數據庫造成影響。
關於php操作mysql執行數據庫查詢的一些常用操作匯總
php操作mysql步驟:
1.$connect=mysql_connect(‘localhost’,’root’,’123456′)
or
die(‘數據庫連接失敗。’mysql_error());鏈接mysql。
2.mysql_select_db(‘database’,$connect)選擇鏈接的數據庫。
3.mysql_query(‘Set
names
gb2312′);$sql
=
“select
*
from
blog_article”;準備要查詢的數據。
4.$datas
=
mysql_query($sql);執行sql查詢。
5.$data
=
mysql_fetch_assoc($datas)得到查詢到的緩存在內存中的一條數據。
6.print_r($data);
相同點:三個函數都是返回數據庫中查詢到的一行數據(說的再清楚點就是一條數據)。
不同點:mysql_fetch_assoc()用的是數據庫中相應的字段名作為的key值(也就是數組下標)
如:filed[‘id’]=1;
mysql_fetch_row()用的是自動生成的數字(從0開始依次生成)作為的key值(也就是數組下標)
如:filed[0]=1;
mysql_fetch_array()用的是自動生成的數字(從0開始依次生成)作為的key值(也就是數組下標),而且它還同時生成數據庫中相應的字段名作為的key值(也就是數組下標)
如:
filed[0]=1,filed[‘id’]=1;也就是說,mysql_fetch_array()將mysql_fetch_assoc()和mysql_fetch_row()查詢到的結果合為了一體了。
mysql_fetch_object()與mysql_fetch_assoc()差不多。只是mysql_fetch_assoc()返回的是數組。mysql_fetch_object()返回的是object對象。
mysql_insert_id() 取得上一步
INSERT
操作產生的
ID。
mysql_result()
函數返回結果集中一個字段的值。
mysql_num_fields()
函數返回結果集中字段的數目。
mysql_affected_rows();返回前一次
MySQL
操作所影響的記錄行數。
mysql_num_rows(mysql_query($sql))獲得結果集中行的數目。
mysql_pconnect()
函數打開一個到
MySQL
服務器的持久連接。
mysql_pconnect()
和
mysql_connect()
非常相似,但有兩個主要區別:
1.
當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。
2.
其次,當腳本執行完畢後到
SQL
服務器的連接不會被關閉,此連接將保持打開以備以後使用(mysql_close()
不會關閉由
mysql_pconnect()
建立的連接)。
mysql_data_seek(mysql_query($sql),8);獲得結果集中的第8條數據。(mysql_num_rows(mysql_query($sql))和mysql_data_seek(mysql_query($sql),8)在mysql_unbuffered_query($sql)不可以使用。)
mysql_unbuffered_query($sql)和mysql_query($sql)效果差不多,但是
mysql_unbuffered_query($sql)不緩存。mysql_query($sql)會緩存查詢的結果。
mysql_close();關閉mysql的最近的鏈接。
mysql_field_flags(mysql_query($sql),6)返回第六個字段的表屬性輸出如:not_null
primary_key
auto_increment
。
mysql_fetch_lengths(mysql_query($sql))返回該條數據的所有字段的每個字段的長度。返回的是一個數字組成的數組。
mysql_field_name(mysql_query($sql),3)返回第三個字段的字段名。
mysql_field_table(mysql_query($sql),0)返回指定字段所在的表名。
mysql_free_result(mysql_query($sql))
函數釋放結果內存。
mysql_get_client_info()
函數返回
MySQL
客戶端信息。
mysql_get_host_info()
取得
MySQL
主機信息。
怎麼把mysql的數據緩存進redis
1,redis是一種內存性的數據存儲服務,所以它的速度要比mysql快。
2,redis只支持String,hashmap,set,sortedset等基本數據類型,但是不支持聯合查詢,所以它適合做緩存。
3,有時候緩存的數據量非常大,如果這個時候服務宕機了,且開啟了redis的持久化功能,重新啟動服務,數據基本上不會丟。
4,redis可以做內存共享,因為它可以被多個不同的客戶端連接。
5,做為mysql等數據庫的緩存,是把部分熱點數據先存儲到redis中,或第一次用的時候加載到redis中,下次再用的時候,直接從redis中取。
6,redis中的數據可以設置過期時間expire,如果這個數據在一定時間內沒有被延長這個時間,那個一定時間之後這個數據就會從redis清除。
所以,redis只是用來緩存數據庫中經常被訪問的數據,可以增加訪問速度和並發量。而mysql只是提供一種數據備份和數據源的作用。
如何MySQL查詢緩存求答案
當在使用中,查詢緩存會存儲一個 SELECT 查詢的文本與被傳送到客戶端的相應結果。如果之後接收到一個同樣的查詢,服務器將從查詢緩存中檢索結果,而不是再次分析和執行這個同樣的查詢。
注意:查詢緩存絕不返回過期數據。當數據被修改後,在查詢緩存中的任何相關詞條均被轉儲清除。
在某些表並不經常更改,而你又對它執行大量的相同查詢時,查詢緩存將是非常有用的。對於許多 WEB 服務器使用大量的動態信息,這是一個很典型的情況。
下面是查詢緩存的一個性能數據。(這些結果的產生,是通過在一個 a Linux Alpha 2 x 500 MHz、2GB RAM 和 64MB 查詢緩存上執行 MySQL 基準套件和到的):
如果你執行的所有查詢均是簡單的(比如從表中一行一行的選取);但是仍然是不同的,所以該查詢不能被緩衝,查詢緩存處於活動時,開銷為 13%。這可以被看作是最差的情況。然而,在實際情況下,查詢是比我們的簡單示例要複雜得多的,所以開銷通常顯着得低。
在只有一行記錄表中搜索一行後,搜索將快 238% 。這可以被認為是接近於對一個被緩衝的查詢所期望的最小的加速。
如果你希望禁用查詢緩存,設置 query_cache_size=0。禁用了查詢緩存,將沒有明顯的開銷。(在配置選項 –without-query-cache 的幫助下,查詢緩存可以被排除在外碼之外)
查詢在分析之前先被比較,因而
SELECT * FROM tbl_name和Select * from tbl_name
對於查詢緩存被當作是不同的查詢,因而查詢需要嚴格的一致(字節對字節的),才會被認為是同樣的。 另外,如果一個客戶端使用一個新的連接協議格式或不同於其它客戶端的另一個字符集,一個查詢將被視為不同的。
使用不同數據庫的,使用不同協議版本的,或使用不同的缺省字符串的查詢將被認為是不同的查詢,並將分別的緩衝。
高速緩衝不對 SELECT CALC_ROWS … 和 SELECT FOUND_ROWS() … 類型的查詢起作用,因為找到的行的數目也是被存儲在緩衝里的。
如果查詢結果被從查詢緩存中返回,那麼狀態變量 Com_select 將不會被增加,但是 Qcache_hits 卻會增加。
查看章節 6.9.4 查詢緩存的狀態和維護。
如果一個表發生的改變 (INSERT, UPDATE, DELETE, TRUNCATE, ALTER 或 DROP TABLE|DATABASE),那麼所有這張表使用的緩衝的查詢(可能通過一個 MRG_MyISAM 表!)將被得失效,並從緩衝中移除。
InnoDB 表的事務所做的更改將在一個 COMMIT 被完成時,使數據失效。
如果一個查詢包括下面的函數,它將不能被緩衝:
函數 函數 函數
User-Defined Functions CONNECTION_ID FOUND_ROWS
GET_LOCK RELEASE_LOCK LOAD_FILE
MASTER_POS_WAIT NOW SYSDATE
CURRENT_TIMESTAMP CURDATE CURRENT_DATE
CURTIME CURRENT_TIME DATABASE
ENCRYPT (只有一個參數調用) LAST_INSERT_ID RAND
UNIX_TIMESTAMP (無參數調用) USER BENCHMARK
如果一個查詢包含用戶變量,引用 MySQL 系統數據庫,或下列之一的格式,SELECT … IN SHARE MODE, SELECT … INTO OUTFILE …, SELECT … INTO DUMPFILE … 或 SELECT * FROM AUTOINCREMENT_FIELD IS NULL (檢索最後一個插入 ID – ODBC 語句),該查詢亦不可以被緩存。
然而,FOUND ROWS() 將返回正確的值,即使先前的查詢是從緩存中讀取的。
萬一一個查詢不使用任何錶,或使用臨時表,或用戶對任何相關表有一個列權限,那麼查詢將不會被緩存。
在一個查詢從查詢緩存中讀取前,MySQL 將檢查用戶對所有相關的數據庫和表有 SELECT 權限。
原創文章,作者:EYQA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/142356.html