Mysql如何解決實際項目中問題,以及原理?

 

1.session 1:select id = 1 and version=1 ,update count=count-1 where id =1 and version=1  session 2:select id = 1 and version=1 ,update count=count-1 where id =1 and version=1    session2裏面的version變成了2

mvccs是樂觀鎖的一種實現方式,這種不是最好哦的解決辦法。

實際上  秒殺中出現超賣問題可以用樂觀鎖mvcc,悲觀鎖,redis隊列都可以解決。

排他鎖,共享鎖等等就是悲觀鎖,是一種思想,表級鎖,行級鎖,共享鎖,排他鎖有實際操作。

innodb中 where條件如果不是用索引加鎖,就會從行級鎖(bewteen)升級成表鎖。

where  id>1 屬於區間,也就是間隙還是屬於行鎖。
行級鎖不會升級爲頁級鎖。

數據庫大體結構:/tmp/mysql.sock 【提供類型接口api】給php,java,python等。
連接層包括:[api接口]和【sql層】(解析sq語句,選擇最優執行方案l)->【儲存引起】(比如innodb,myisam)

提問環節,
在表設計的時候加version【字段】,先來後到 

soket[提供鏈接的,ip+端口?]

死鎖是交叉鎖。同一條數據的不同用戶session的加鎖,是不會出現死鎖的。但是有可能會出現髒讀。

 

Mysql結構與執行

mysql.sock 會出現丟失的情況。怎麼解決這種情況?
1重啓mysql服務,重新配置。
2,重新複製一份/在linux:/tmp/mysql.sock

pdo連接方式與mysqli連接是不一樣的。
pdo 對於sql注入會有保障

存儲引擎就是用戶記錄的信息。innodb和myisam

mysql 服務層纔是最核心的。連接/線程 =>連接層:

最大連接數 show variable like '%max_count%'
如果max_connections=100 ,If有1000個連接。可能有些連接有短暫的延遲,但是不會出現阻塞。
【這個參數隨便設置,但是受制於機器的物理連接能力啊】越大對於我們IO消耗越多。

短鏈接和場鏈接還是有區別的。

如果一個請求完成有可能關閉也有可能進入睡眠狀態。當一定時間內沒有重新開始。sleep就會釋放掉。
show processlist ;都能看到state
如果sleep 就是睡眠狀態。線程是睡覺狀態。
不會太消耗內存資源。如果進程關了之後,重新開,sleep線程就都沒有了。

到達sql 層之後
1,需要先判斷SQL語句接口->判斷sql類型如下,有query dml【update,delete,insert】ddl【alter 修改表,主從複製rep,status狀態】
2,如果是query 類型,判斷是否開啓查詢緩存。如果能命中查詢緩存。就返回數據
3,如果沒有命中緩存的情況。解析器,會把握我們的SQL解析成token(令牌),會吧執行的SQL每一個符號分解成令牌。

語法解析器:根據得到的令牌進行組裝成對應 解析數據結構【樹狀結構】
sql 中關鍵詞會成爲對應的方法。
主要是對於where條件的。不會對於整條語句的。eg: id<10  where *...and id <10 and 成爲解析樹的結構二叉樹。


解析樹狀->會進去優化器【根據我們得到的解析樹】
過濾沒有用的查詢,常量表達式 預算成常量值
對查詢結構進行調整。分析索引信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章