mysql部門人員排序設計 MySQL閒談(一)

2021-10-12 03:27:26 字數 4470 閱讀 9957

話外

mysql算是目前最流行的關係學資料庫管理系統,但是mysql中的「my」含義是什麼?可能能很多人都會說命名者想與使用者搞好關係,直接翻譯成「我的sql」,讓使用者倍感親切,其實真實原因是mysql創始人monty 其女兒名為 my widenius,monty2023年建立mysql時直接用其女兒名字命名該產品,my widenius見文末。

資料庫事務與四特性

資料庫事務正確執行的是個基本要素。acid,原子性(atomicity)、一致性(correspondence)、隔離性(isolation)、永續性(durability)。

注: 原子性與一致性區別:原子性關注狀態,要麼全部成功,要麼全部失敗,不存在部分成功的狀態。一致性關注資料的可見性,中間狀態的資料對外部不可見,只有最初狀態和最終狀態的資料對外可見。

mysql鎖

鎖種類在關係型資料庫中,可以按照鎖的粒度把資料庫鎖分為行級鎖(innodb引擎)、表級鎖(myisam引擎)和頁級鎖(bdb引擎 )。myisam和innodb儲存引擎使用的鎖:

行級鎖,表級鎖和頁級鎖對比

從鎖的類別上來講,有共享鎖和排他鎖。

鎖的粒度取決於具體的儲存引擎,innodb實現了行級鎖,頁級鎖,表級鎖。他們的加鎖開銷從大到小,併發能力也是從大到小。

innodb儲存引擎的鎖的演算法

其他:

innodb對於行的查詢使用next-key lock

next-locking keying為了解決phantom problem幻讀問題

當查詢的索引含有唯一屬性時,將next-key lock降級為record key

gap鎖設計的目的是為了阻止多個事務將記錄插入到同一範圍內,而這會導致幻讀問題的產生

有兩種方式顯式關閉gap鎖:(除了外來鍵約束和唯一性檢查外,其餘情況僅使用record lock) a. 將事務隔離級別設定為rc b. 將引數innodb_locks_unsafe_for_binlog設定為1

資料庫三正規化

1 第一正規化(1nf)

在任何乙個關聯式資料庫中,第一正規化(1nf)是對關係模式的基本要求,不滿足第一正規化(1nf)的資料庫就不是關聯式資料庫。所謂第一正規化(1nf)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1nf)中表的每一行只包含乙個例項的資訊。簡而言之,第一正規化就是無重複的列。

2 第二正規化(2nf)

第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。第二正規化(2nf)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成乙個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。簡而言之,第二正規化就是非主屬性非部分依賴於主關鍵字。

3 第三正規化(3nf)

滿足第三正規化(3nf)必須先滿足第二正規化(2nf)。簡而言之,第三正規化(3nf)要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在乙個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3nf)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。(我的理解是消除冗餘)

索引的工作原理及其種類

資料庫為啥要加索引?可以將資料庫比喻成一本書,當我們需要檢視某篇文章時,我們可以選擇一頁一頁的翻找,知道找到為止,我們也可以通過目錄找到該文章所在的頁碼,然後直接翻到這一頁。資料庫所以就是好比書的目錄,讓我們查詢時更加快速。

資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。為表設定索引要付出代價的:一是增加了資料庫的儲存空間,二是在插入和修改資料時要花費較多的時間(因為索引也要隨之變動)。

圖展示了一種可能的索引方式。左邊是資料表,一共有兩列七條記錄,最左邊的是資料記錄的實體地址(注意邏輯上相鄰的記錄在磁碟上也並不是一定物理相鄰的)。為了加快col2的查詢,可以維護乙個右邊所示的二叉查詢樹,每個節點分別包含索引鍵值和乙個指向對應資料記錄實體地址的指標,這樣就可以運用二叉查詢在o(log2n)的複雜度內獲取到相應資料。

索引的優點

通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

索引的缺點

建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

索引建立原則

1. 當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。

2. 對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。

3. 對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的資料行的比例很大。增加索引,並不能明顯加快檢索速度。

4. 對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

唯一索引

唯一索引是不允許其中任何兩行具有相同索引值的索引。

當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。主鍵索引資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。

(非)聚簇索引

在非聚簇索引中查詢語句所要求的字段如果全部命中了索引,那麼就不必再進行回表查詢。例如:假設我們在員工表的年齡上建立了索引,那麼當進行select age from employee where age < 20的查詢時,在索引的葉子節點上,已經包含了age資訊,不會再次進行回表查詢。

注意:innodb中,在聚簇索引之上建立的索引稱之為輔助索引,輔助索引訪問資料總是需要二次查詢,非聚簇索引都是輔助索引,像復合索引、字首索引、唯一索引,輔助索引葉子節點儲存的不再是行的物理位置,而是主鍵值。

聯合索引

mysql可以使用多個字段同時建立乙個索引,叫做聯合索引。在聯合索引中,如果想要命中索引,需要按照建立索引時的字段順序挨個使用,否則無法命中索引。

具體原因為:

mysql使用索引時需要索引有序,假設現在建立了"name,age,school"的聯合索引,那麼索引的排序為: 先按照name排序,如果name相同,則按照age排序,如果age的值也相等,則按照school進行排序。

當進行查詢時,此時索引僅僅按照name嚴格有序,因此必須首先使用name欄位進行等值查詢,之後對於匹配到的列而言,其按照age欄位嚴格有序,此時可以使用age欄位用做索引查詢,以此類推。因此在建立聯合索引的時候應該注意索引列的順序,一般情況下,將查詢需求頻繁或者字段選擇性高的列放在前面。此外可以根據特例的查詢或者表結構進行單獨的調整。

超鍵、候選鍵、主鍵、外來鍵

最左匹配原則

mysql binlog錄入格式

my widenius 臉書頭像

mysql部門分類 mysql部類參照 mysql

mysql資料庫內容總結 數字型別 tinyint m unsigned zerofull 1個位元組 預設的是有符號的 128 127 unsigned 無符號整數 範圍0 255 m 代表寬度 在zerofull時才有意義 只是乙個顯示效果,不會影響到實際的資料長度 zerofull 零填充 如...

8 部門人員績效考核 部門管理經驗談

部門人員的績效考核是關係到部門內部每個員工的切身利益,所以這個也是部門經理對部門的績效進行處理的乙個要點。前面筆者也寫過乙個專案組的績效考核的博文,這個需要和部門績效考核實際掛鉤起來一起處理 6 專案組人員績效考核 專案管理系列文章。一 專案組人員考核 前面寫過的專案組內部人員的考核的博文,這裡再描...

8 部門人員績效考核 部門管理經驗談

部門人員的績效考核是關係到部門內部每個員工的切身利益,所以這個也是部門經理對部門的績效進行處理的乙個要點。前面筆者也寫過乙個專案組的績效考核的博文,這個需要和部門績效考核實際掛鉤起來一起處理 6 專案組人員績效考核 專案管理系列文章。一 專案組人員考核 前面寫過的專案組內部人員的考核的博文,這裡再描...