MYSQL---SQL語句的資料快取

T1YSL發表於2021-07-03

1. 查詢快取設定

1) 驗證伺服器是否支援查詢快取

show variables like '%have_query_cache%';

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| have_query_cache | YES   |

+------------------+-------+

2) 查詢快取會受到以下3個系統變數值的影響

show variables like 'query_cache%';

+------------------------------+---------+

| Variable_name                | Value   |

+------------------------------+---------+

| query_cache_limit            | 1048576 |  //能夠快取的最大結果集大小

| query_cache_min_res_unit     | 4096    |

| query_cache_size             | 1048576 |  //決定為查詢快取分配的記憶體大小

| query_cache_type             | OFF     |  //決定查詢快取的操作方式

| query_cache_wlock_invalidate | OFF     |

+------------------------------+---------+

那麼mysql到底是怎麼決定到底要不要把查詢結果放到查詢快取中呢?是根據query_cache_type這個變數來決定的。

這個變數有三個取值:0,1,2,分別代表了off、on、demand。

mysql預設為開啟 on (1)

如果是0,那麼query cache 是關閉的。

如果是1,那麼查詢總是先到查詢快取中查詢,即使使用了sql_no_cache仍然查詢快取,因為sql_no_cache只是不快取查詢結果,而不是不使用查詢結果。

如果是2,DEMAND沒有使用sql_cache,好像仍然使用了查詢快取

結論:只要query_cache_type沒有關閉,sql查詢總是會使用查詢快取,如果快取沒有命中則開始查詢的執行計劃到表中查詢資料。

 

2. sql_cahce和sql_no_cache hints的使用

為了測試sql語句的效率,有時候要不用快取來查詢。

使用SELECT SQL_NO_CACHE ...語法即可

SQL_NO_CACHE的真正作用是禁止快取查詢結果,但並不意味著cache不作為結果返回給query。

 

目前的SQL_NO_CACHE有兩種解釋:

1.對當前query不使用資料庫已有快取來查詢,則當前query花費時間會多點

2.對當前query的產生的結果集不快取至系統query cache裡,則下次相同query花費時間會多點

 

sql_cache意思是說,查詢的時候使用快取。

對SQL_NO_CACHE的解釋及測試如下:

SQL_NO_CACHE means that the query result is not cached. It does not meanthat the cache is not used to answer the query.

You may use RESET QUERY CACHE to remove all queries from the cache and then your next query should be slow again. Same effect if you change

the table, because this makes all cached queries invalid.

 

mysql> select count(*) from users where email = 'hello';

+----------+

| count(*) |

+----------+

| 0        |

+----------+

1 row in set (7.22 sec)

 

mysql> select count(*) from users where email = 'hello';

+----------+

| count(*) |

+----------+

| 0        |

+----------+

1 row in set (0.45 sec)

 

mysql> select count(*) from users where email = 'hello';

+----------+

| count(*) |

+----------+

| 0        |

+----------+

1 row in set (0.45 sec)

 

mysql> select SQL_NO_CACHE count(*) from users where email = 'hello';

+----------+

| count(*) |

+----------+

| 0        |

+----------+

1 row in set (0.43 sec)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2779525/,如需轉載,請註明出處,否則將追究法律責任。

相關文章