mysql特別點 常見的MySQL面試點(二)

2021-10-18 17:18:19 字數 2122 閱讀 1523

1. 什麼是死鎖?如何解決資料庫死鎖?

因為資料庫鎖的最細粒度是行鎖,當乙個開啟事務後,修改某行,在提交事務前,同一行資料在另乙個執行緒也出現了修改。這個時候,後面出現的這個修改語句會發生堵塞,等待前面的事務提交後再開始執行。

如果同一時刻兩個執行緒發生這種情況:

begin;update a 行;update b 行, commit;

begin;update b 行;updatea 行, commit;

兩個執行緒互相等待另一方提交事務,這個時候就出鎖衝突,出現死鎖。

解決死鎖:

• 把最容易出現死鎖的行放到整個事務的最後執行,減少死鎖時間,提高併發。

• 資料庫配置中有兩種策越來解決死鎖:

• 死鎖超時等待,當發生死鎖的時候,第乙個死鎖執行緒等待50s後自動釋放鎖,其他執行緒才繼續執行,這個一般不採納。

• 死鎖檢測,每當開啟乙個事務的時候,檢測自己修改的行,是否被別的執行緒鎖住,判斷自己是否發生了死鎖;缺點是:cpu負擔加重。

2. 事務之間是如何隔離的?

每個事務開啟的時候會建立乙個read-view檢視,即使其他事務修改了資料,但是不影響本事務的檢視,另外檢視的建立就是給事務新增乙個版本號,並非直接copy乙份資料。因此同一行資料可能存在版本號,存在多個檢視,通過檢視進行事務隔離。

3. 普通索引和唯一索引的區別?該如何選擇?

使用普通索引查詢時,查詢索引樹上的葉子節點,命中目標後,還會繼續往下查詢;使用唯一索引查詢時,命中目標後直接返回。

查詢時,效能上兩者微乎其微,因為查詢時是按資料頁查詢的,每次返回資料是把目標行的資料頁都返回過來,普通索引的多做的一次判斷操作只是乙個指標的挪動。

資料更新時,每次都是將資料更新到change buffer記憶體中,以後查詢時只要查詢記憶體中的資料,目標是減少磁碟訪問。change buffer也支援持久化,當更新後訪問這個資料頁時會觸發持久到磁碟中,同時後台也會定期持久化。當查詢時假如changebuffer中不存在資料,則將資料從磁碟中讀取到change buffer中。

當資料存在記憶體中時:

• 普通索引直接將更新寫入change buffer。

• 唯一索引先判斷資料的唯一性,再寫入。

當資料只存在磁碟中時:

• 普通索引直接將更新寫入change buffer。

• 唯一索引先將資料寫入記憶體中,再判斷,最後更新。

因此:多利用change buffer 可以提高系統效能,特別是寫多讀少的情況,寫到記憶體後,只要不立刻出現查詢,都可以交給後台執行緒持久化到磁碟。 例如賬單,日誌系統,因此這種情況推薦使用普通索引。反之,寫少讀多的場景,使用唯一索引。

4. 為什麼sql語句突然慢了一下?

sql更新時,首先會把更新寫到記憶體redo log中,然後返回客戶端更新成功,當redo log 寫滿了的時候,再flush 記憶體中的redolog到磁碟中。這個過程可能導致sql語句抖動一下。

5. 為什麼表資料刪除了一半?但是檔案大小不變?

6. count(*)和count(字段)的區別?

count(*)因為肯定不是null, 只需要按行累加和count(1)差不多。

count(字段)需要判斷字段不能為null,不為null才進行累加。

7. order by 的執行流程?

使用explain 可以看到extra中 有using filesort用於排序。首先初始化乙個sort buffer記憶體用於排序,通過主鍵查詢到所需要的資料後存放到sort buffer當中,再按照特定字段進行排序,最後返回結果集。排序是乙個成本較高的操作,但是如果是按照索引排序,這個時候就不需要初始化sort buufer排序了,因為查到到的資料已經預設排序好了,直接返回結果集。

8.查詢遇到哪些坑?

• 在where條件後使用函式,無法走索引。例如 where month(filed) = 12,使用 explain 命令可以看到執行計畫上 rows走的是全域性遍歷。

• 索引欄位上,型別轉換後無法走索引。例如欄位a是varchar型別,但是 where a = 142。這樣也無法走索引。

• 小表 left join大表 。 在關聯查詢時, 小表驅動大表,可以提高查詢效率。

• in和exist的區別;使用in 的時候,先查詢主表的資料,再判斷主表中符合的條件。 使用exist的時候,先查詢條件表再放到主表中判斷是true false,true則返回。

mysql特別點 Mysql 特別注意點!

初始環境 create table product id int unsigned not null auto increment,amount int unsigned default null primary key id engine innodb charset utf8 insert in...

布局(layout)資源的特別注意點

1.根元素可以是 viewgroup view或,但只能有乙個根元素且必須包含帶 android 命名空間的 xmlns android 屬性。2.android layout height和android layout width的值 高度和寬度值能用 android 支援的度量單位 px,dp,...

mysql常見的優化策略 Mysql常見的優化策略

資料庫設計方面優化 1 資料庫設計符合第三正規化,為了查詢方便可以有一定的資料冗餘。2 選擇資料型別優先順序 int date,time enum,char varchar blob,選擇資料型別時,可以考慮替換,如ip位址可以用ip2long 函式轉換為unsign int型來進行儲存。3 對於c...