Mysql8.0為什麼取消了快取查詢的功能

2023-04-20 18:01:32

首先我們介紹一下MySQL的快取機制

【MySQL快取機制】簡單的說就是快取sql文字及查詢結果,如果執行完全相同的SQL,伺服器直接從快取中取到結果,而不需要再去解析和執行SQL。

但如果表中任何資料或是結構發生改變,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,最簡單的就是我們在SQL語句中多了空格啥的,註釋,或者是大小寫,那麼hashmap中的key和value對應都是不一樣的,那麼使用這個表的所有快取查詢將不再有效。。

快取是對系統效能優化的重要手段。。。

主要是因為

1.MySQL快取是基於Hashmap的:查詢語句的字元大小寫、空格或者註釋的不同,快取查詢都會認為是不同的查詢(因為他們的hash值會不同)

2.MySQL會對每條接收到的SELECT型別的查詢進行hash計算,然後查詢這個查詢的快取結果是否存在。雖然hash計算和查詢的效率已經足夠高了,一條查詢語句所帶來的開銷可以忽略,但一旦涉及到高並行,有成千上萬條查詢語句時,hash計算和查詢所帶來的開銷就必須重視了。。。

3.也就是修改某個表的內容時,之前快取的內容對於現在的資料來說就是錯誤的資料,所以我們要將之前的快取資料刪除,來保證資料的正確性。當向某個表寫入資料的時候,必須將和這個表相關的所有快取設定為失效,如果快取內容很多,則消耗也會很大,可能使系統僵死,因為這個操作是靠全域性鎖操作來保護的。。

總結

所以綜合上述的內容,我們知道原因就是如果資料都要快取起來,一旦這些資料都發生改變時,需要更改,我們又需要把這些快取刪除,資料量大時,就會很慢,效率低。

解決思路是:把一些容易變動的資料還是存在磁碟上,而不是在快取中,這樣就是省去了快取改來改去的問題。。

解決方案:運用了新的資料庫Redis 

介紹一下redis ----Redis是當前比較熱門的NoSQL系統之一---,Redis資料都是快取在計算機記憶體中。。

NoSQL,泛指非關係型的資料庫區別於關聯式資料庫,它們不保證關係資料的ACID特性。。。。

 

這裡我們又要引入事務的概念,如下:

事務定義

事務是一系列操作組成的工作單元,該工作單元內的操作是不可分割的,即要麼所有操作都做,要麼所有操作都不做,這就是事務。

       理解一:

       事務可以看做是一次大的活動,它由不同的小活動組成,這些活動要麼全部成功,要麼全部失敗。

       理解二:

       事務可以看做是一個大的操作,它由一系列操作組成,這些操作要麼全部成功,要麼全部失敗。

 

ACID---事務的四大特性 ---原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)

A:事務是一個不可分割的整體,事務中的操作要麼全部成功,要麼全部失敗。。

舉一個SQL事務的例子:
begin
transaction; update account set money = money-100 where name = '張三'; update account set money = money+100 where name = '李四'; commit transaction;
這裡面的兩個操作必須都成功或者都失敗。。。。。

 

B:我們來看一段狗屁話:事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態,能理解?????

個人認為就是執行這操作能夠達到你的目的,然後不出錯,在編寫中體現在語法和實現是否可行,在功能上就是可以保證最後的結果和你的想法是一致的。。。

 

I:隔離性體現在:多個使用者並行存取資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的運算元據所幹擾,多個並行事務之間要相互隔離。

 

D:永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響

也就是說,給你造成了影響,你一旦告訴我你操作成功了,是不可以不執行的。。。。

 

 

本地事務的實現:

begin transaction;

  //1.本地資料庫操作:張三減少100元。

  //2.本地資料庫操作:李四增加100元。

commit transaction;


分散式事務的實現:

begin transaction;

  //1.本地資料庫操作:張三減少100元。

  //2.遠端呼叫:讓李四增加100元。

commit transaction;