原文地址:MySQL面試常見題目(二)
1、聚集索引和非聚集索引的區別?
-
一張表中只能存在一個聚集索引,非聚集索引不限制數量,
-
聚集索引中鍵值的邏輯順序決定表中相應行的物理順序,非聚集索引中的邏輯順序與磁盤上行的物理順序不同,
-
聚集索引的物理存盤按索引排序,非聚集索引不按索引排序,
-
索引是通過二叉樹來描述資料結構的,聚集索引的葉子節點就是資料節點,非聚集索引的葉子節點還是索引節點,只是有個指標指向對應的資料塊,
2、使用聚集索引或非聚集索引的時機?

3、如何選擇合適的分布式主鍵方案?
-
資料庫自增長序列或欄位,
-
UUID,
-
Redis生成ID,
-
Twitter的snowflake演算法,
-
利用zookeeper生成唯一ID,
-
MongoDB的objectId,
4、事務的隔離級別有哪些?
-
讀未提交(read uncommitted),
-
讀已提交(read committed),
-
可重復讀(repeatable read),
-
串行化(serializable),
5、MySQL默認的事務隔離級別是可重復讀(repeatable read),
6、幻讀、臟讀、不可重復讀的定義?
-
事務A、B交替執行,因為A讀到B未提交的內容,致使A被B干擾到,這是臟讀,
-
不可重復讀:同一事務范圍內,相同查詢回傳不同資料,
-
幻讀:A查詢某范圍資料,并發事務B操作該范圍資料且悄悄提交,A再次查詢時,兩次資料不一致,
7、MySQL的樂觀鎖和悲觀鎖?
a、悲觀鎖:當事務獲得悲觀鎖時,任何事務都不可對資料進行操作,只能等釋放,

b、樂觀鎖:允許多個事務同時對資料進行操作,可通過版本號機制或CAS實作,

8、高并發情況下,MySQL如何安全修改同一行資料?
首先需要保證的就是當一個執行緒操作當前資料時,其它執行緒無法對當前資料進行操作,一般有樂觀鎖和悲觀鎖兩種方案,
悲觀鎖的思想就是當前執行緒操作資料時,其它執行緒無法訪問,像如下SQL:
select * from User where name=‘123’ for update
上述SQL鎖定user表中所有name為123的記錄,在當前事務操作提交之前,別的執行緒都無法對這些資料進行操作,
樂觀鎖的思想就是有執行緒修改就先放過去進行修改操作,如果別的執行緒沒操作過這條資料,就可修改成功,操作過就直接失敗或是重試,一般用版本號機制或是CAS實作,
9、select for update有什么含義?會鎖表、鎖行還是?
單純的select不會加鎖,但select for update除查詢外,還會加鎖,而且是悲觀鎖,如果SQL中沒有用到主鍵或是索引,則加表鎖,反之就是行鎖,
至此,本次分享就結束了,后期會慢慢補充的,
以上僅為個人觀點,不一定準確,能幫到各位那是最好的,
好啦,到這里本文就結束了,喜歡的話就來個三連擊吧,
以上均為個人認知,如有侵權,請聯系洗掉,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/347087.html
標籤:其他
