首先我們介紹一下MySQL的緩存機(jī)制
【MySQL緩存機(jī)制】簡單的說就是緩存sql文本及查詢結(jié)果,如果運行完全相同的SQL,服務(wù)器直接從緩存中取到結(jié)果,而不需要再去解析和執(zhí)行SQL。
但如果表中任何數(shù)據(jù)或是結(jié)構(gòu)發(fā)生改變,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,最簡單的就是我們在SQL語句中多了空格啥的,注釋,或者是大小寫,那么hashmap中的key和value對應(yīng)都是不一樣的,那么使用這個表的所有緩存查詢將不再有效。。
緩存是對系統(tǒng)性能優(yōu)化的重要手段。。。
主要是因為
1.MySQL緩存是基于Hashmap的:查詢語句的字符大小寫、空格或者注釋的不同,緩存查詢都會認(rèn)為是不同的查詢(因為他們的hash值會不同)
2.MySQL會對每條接收到的SELECT類型的查詢進(jìn)行hash計算,然后查找這個查詢的緩存結(jié)果是否存在。雖然hash計算和查找的效率已經(jīng)足夠高了,一條查詢語句所帶來的開銷可以忽略,但一旦涉及到高并發(fā),有成千上萬條查詢語句時,hash計算和查找所帶來的開銷就必須重視了。。。
3.也就是修改某個表的內(nèi)容時,之前緩存的內(nèi)容對于現(xiàn)在的數(shù)據(jù)來說就是錯誤的數(shù)據(jù),所以我們要將之前的緩存數(shù)據(jù)刪除,來保證數(shù)據(jù)的正確性。當(dāng)向某個表寫入數(shù)據(jù)的時候,必須將和這個表相關(guān)的所有緩存設(shè)置為失效,如果緩存內(nèi)容很多,則消耗也會很大,可能使系統(tǒng)僵死,因為這個操作是靠全局鎖操作來保護(hù)的。。
總結(jié):
所以綜合上述的內(nèi)容,我們知道原因就是如果數(shù)據(jù)都要緩存起來,一旦這些數(shù)據(jù)都發(fā)生改變時,需要更改,我們又需要把這些緩存刪除,數(shù)據(jù)量大時,就會很慢,效率低。
解決思路是:把一些容易變動的數(shù)據(jù)還是存在磁盤上,而不是在緩存中,這樣就是省去了緩存改來改去的問題。。
解決方案:運用了新的數(shù)據(jù)庫Redis?
介紹一下redis ----Redis是當(dāng)前比較熱門的NoSQL系統(tǒng)之一---,Redis數(shù)據(jù)都是緩存在計算機(jī)內(nèi)存中。。用redis去存儲熱點數(shù)據(jù),也是那些在數(shù)據(jù)庫中大量的人去訪問的數(shù)據(jù)。。
NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫區(qū)別于關(guān)系數(shù)據(jù)庫,它們不保證關(guān)系數(shù)據(jù)的ACID特性。。。。
?文章來源:http://www.zghlxwxcb.cn/news/detail-419476.html
這里我們又要引入事務(wù)的概念,如下:
事務(wù)定義
事務(wù)是一系列操作組成的工作單元,該工作單元內(nèi)的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,這就是事務(wù)。
???????理解一:
???????事務(wù)可以看做是一次大的活動,它由不同的小活動組成,這些活動要么全部成功,要么全部失敗。
???????理解二:
???????事務(wù)可以看做是一個大的操作,它由一系列操作組成,這些操作要么全部成功,要么全部失敗。
?
ACID---事務(wù)的四大特性 ---原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
A:事務(wù)是一個不可分割的整體,事務(wù)中的操作要么全部成功,要么全部失敗。。
舉一個SQL事務(wù)的例子:
begin transaction; update account set money = money-100 where name = '張三'; update account set money = money+100 where name = '李四'; commit transaction;
這里面的兩個操作必須都成功或者都失敗。。。。。
?
B:我們來看一段狗屁話:事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài),能理解?????
個人認(rèn)為就是執(zhí)行這操作能夠達(dá)到你的目的,然后不出錯,在編寫中體現(xiàn)在語法和實現(xiàn)是否可行,在功能上就是可以保證最后的結(jié)果和你的想法是一致的。。。
?
I:隔離性體現(xiàn)在:多個用戶并發(fā)訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個并發(fā)事務(wù)之間要相互隔離。
?
D:持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。
也就是說,給你造成了影響,你一旦告訴我你操作成功了,是不可以不執(zhí)行的。。。。
?
?
本地事務(wù)的實現(xiàn): begin transaction; //1.本地數(shù)據(jù)庫操作:張三減少100元。 //2.本地數(shù)據(jù)庫操作:李四增加100元。 commit transaction; 分布式事務(wù)的實現(xiàn): begin transaction; //1.本地數(shù)據(jù)庫操作:張三減少100元。 //2.遠(yuǎn)程調(diào)用:讓李四增加100元。 commit transaction;
?文章來源地址http://www.zghlxwxcb.cn/news/detail-419476.html
到了這里,關(guān)于Mysql8.0為什么取消了緩存查詢的功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!