MySQL基礎面試知識

2021-10-10 21:56:51 字數 3497 閱讀 2981

一、資料的事務性

原子性:乙個事務的執行要麼執行成功,要麼乾脆不執行,如果執行的過程中一條指令執行錯誤,那麼整個事務進行回滾。

隔離性:事務對資料做出的改變只存在於當前事務中,並不會對其他事務產生影響。

永續性:事務對資料做出改變之後應該永久的儲存在資料庫中。

一致性:一致性是基於上述的三種操作的,資料從一種狀態改變為另一種狀態,但是資料庫的整體穩定性不會改變。

二、併發事務導致的問題

第一類丟失更新:乙個事務的撤銷造成了另乙個事務以及提交的更新資料的丟失。

例如:a有100元存款,想要再存入100元,這時候銀行扣了5元年費,之後a又撤銷了這100元存款的操作,銀行又將餘額從95元變為了100,存錢事務的撤銷造成了扣年費事務資料的丟失。

資料髒讀:乙個事務讀取到了另乙個事務還未提交的資料。

例如:a想要從存款為100的卡中取出100,這時b正在從該卡中取錢100,但是還未取出,a發現餘額不足了,b也沒取出錢來。a讀取到了b還沒提交的事務。

資料幻讀也叫虛讀:事務對資料進行倆次查詢,第二次查詢到的結果集中包含著第一次查詢結果集多出來的或者被刪除的資料,倆次查詢的過程中,有其他事務對資料做出了操作。

不可重複讀:乙個事務對同一行資料進行查詢,結果卻得到了不同狀態的倆行資料。

第二類丟失更新:第二類丟失更新指的是不可重複讀的一種特殊情況,如果倆個事務對同一行資料進行寫操作,那麼第乙個事務更新的資料就會被第二個事務覆蓋。

三、事務的隔離級別(從小到大)

讀未提交(read-ucommitted):

在這種隔離級別下,乙個事務能夠感受到另乙個未提交事務的存在,當事務t1開啟之後,還未提交事務,事務t2也開啟了,這個時候t1雖然未提交,但是t2能感受到t1的操作。

容易出現髒讀,t2讀取到了t1未提交的資料。

讀已提交(read-committed):

這種隔離級別下,乙個事務只有在提交的情況下另乙個事務才能感受到它的存在,但是乙個事務在操作共享資料的時候,另乙個事務依然可以對其進行操作,只不過是提交了之後才能感知到。

容易出現不可重複讀。

不可重複讀(repeatable-read):

這種隔離級別下與前倆種隔離級別不同,當乙個事務正在操作共享資源的時候,它不允許另乙個事務對該資源進行更新操作。

雖然解決了不可重複讀的問題,但是喚醒了插入和刪除操作,造成資料的幻讀。

可序列化(serializable):

這種隔離級別下,完全要求事務乙個乙個序列的執行。

四、資料庫的三正規化

第一正規化:資料庫表中的列都必須具有原子性,也就是說列中每乙個單元格儲存的資料都必須是原子性的,不可拆分的,比如集合、陣列都不能儲存。

第二正規化:資料庫表中的非主鍵欄位都只能依賴於唯一的主鍵,如果不是依賴於唯一的主鍵就會造成資料的冗餘。

第三正規化:資料庫表中的非主鍵字段直接不能相互依賴。

五、資料庫索引

當使用select * 的方式去查詢name欄位為『李四』的所有資訊的時候,資料庫系統會從資料庫表的第一行開始查詢,即便找到了李四也會繼續將整張表讀完,因為這一列中有可能出現倆個或者多個李四。

也就是說資料庫系統必須將該錶的所有資料全部從磁碟中讀取到快取中,然後從快取中依次查詢,本來磁碟io就非常耗時,現在還有將所有資料都從磁碟讀取,效率非常低。

為了解決這種問題,在資料庫之外維護了乙個可以實現高效查詢的資料結構,將表中某一列的資料都放入該資料結構中作為鍵值,並且在放入其中的時候就變為了有序的資料。

有了索引的情況下,再次查詢李四的時候,會先將索引從磁碟中讀入快取,找到李四之後,針對性的去磁碟中查詢李四,大大提高了效率。

而在給一張空表建立索引的時候,資料庫系統會對應的建立乙個索引頁,伴隨著資料插入表中,索引頁也插入一條條索引記錄,索引記錄中包含著鍵值,以及鍵值對應當前行中其他資料的位址引用和對其他索引頁的引用,當索引頁存滿之後,它會建立倆個新的索引頁作為當前索引頁的倆個子節點,並且將父節點中的索引資料近似對半拆分到子節點中。

資料庫索引的分類:

主鍵索引:主鍵索引是用來對欄位進行唯一性標識,該字段中不可以有重複的值,並且不能有null值,一張表中只能有乙個主鍵字段。

普通索引:create index indexname on tablename(列名);

alter table add index indexname on(列名);

加上普通索引的字段中可以有重複的值,只是用於快速查詢。

唯一索引:create unique index indexname on table(列名);

alter table add unique index indexname on(列名);

唯一索引也是對字段進行唯一性標識,與主鍵不同的是,唯一索引欄位中可以有null值,並且在一張表中可以對多個字段新增唯一索引。

聯合索引:

當在查詢語句中經常要使用倆到三個字段值進行條件查詢,那麼將這些字段建立聯合索引提公升查詢效率。

create index indexname on tablename(列名1(length),列名2);也可以在列名後規定索引長度。

alter table tablename add index indexname(列名1,列名2);

列名1為前導列,需要注意的是,在將其中乙個字段作為單獨查詢條件的時候,只有前導列欄位作為查詢條件索引才可以生效,後面的字段索引不會生效,聯合索引的用法是,多條件查詢的時候,查詢完前導字段後面的字段查詢效率更高。

索引失效的方式:

使用is null判斷的時候。

在where查詢條件中使用函式

在where查詢條件中使用大於、小於、不等於。

使用in和not in

使用like模糊查詢

六、資料庫引擎

myisam資料庫引擎

myisam是一種非事務的資料庫引擎,它不支援資料庫事務的acid操作,但是提供了高效的查詢操作,這種引擎將資料檔案和索引檔案分離,並且對索引檔案進行壓縮,這樣的話可以有更多的索引讀到引擎的緩衝區中。

myisam中使用的是表級別的鎖,並且只支援表級別鎖,這種鎖和lock裡面的讀寫鎖機制相同,在讀資料的時候使用的是共享鎖,而涉及到寫的時候就變成了排它鎖。

myisam中可以保持表的行數,在進行select count(*)的時候直接在引擎中讀取之前儲存的行數就可以了,但是有where查詢條件的時候仍然需要全表掃瞄。

在刪除表資料的時候,myisam會先將整個表都drop掉,然後在重新構建乙個空表。

innodb資料庫引擎

innodb是mysql中支援事務的資料庫引擎,在進行大量讀寫操作,並且多事務併發操作的情況下可以使用innodb引擎,這種引擎會將資料檔案和索引檔案繫結在一起。

innodb可以使用行級鎖,也可以使用表級別鎖,但是大部分情況下使用的是行級別鎖,在order by或者select count()的時候,innodb引擎就得使用表級別鎖。

在進行select count()的時候,由於innodb引擎不會儲存表中的行數,所以需要一行一行的記錄。

在刪除表的時候,innodb是一行一行的刪除表資料。

而在表中有auto_increment欄位的時候,在innodb表中只能儲存只有該字段的索引,而myisam可以進行聯合索引。

mysql知識 MySQL高階知識(一) 基礎

1.關於mysql的一些檔案 mysql如何安裝 如何配置自啟動,這裡不進行講述,可自行搜尋相關安裝教程進行處理。這裡主要介紹mysql的主要配置檔案。二進位制日誌log bin 用於主從複製。錯誤日誌log error 預設關閉,記錄嚴重的警告和錯誤資訊,每次啟動和關閉的詳細資訊等。查詢日誌sho...

mysql的知識 mysql基礎知識

一 啟動與退出 1 進入mysql 啟動mysql command line client mysql的dos介面 直接輸入安裝時的密碼即可。此時的提示符是 mysql 或開啟終端,輸入sql語句 mysql uroot p123 2 退出mysql quit或exit 二 庫操作 1 建立資料庫 ...

面試基礎知識準備

影象基礎知識 1.常用的影象空間。2.簡述你熟悉的聚類演算法並說明其優缺點。3.請描述以下任一概念 sift surf lda pca 4.請說出使用過的分類器和實現原理。5.random forest的隨機性表現在 6.graph cut的基本原理和應用。7.gmm的基本原理和應用。8.用具體演算...