1、mysql三正規化
①、第一正規化:每個列都不可以再分,也就是說每一列儲存的內容都不可以再拆分,如位址就應該按照省、市、區等分別建立字段,而不應該放在乙個欄位中。
②、第二正規化:在第一正規化的基礎上,非主鍵要完全依賴於主鍵,而不能部份依賴,換句話說就是一張表只能說明乙個事物。
③、第三正規化,在第二正規化的基礎上,非主鍵只能依賴於主鍵,簡而言之,第三正規化要求乙個資料庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的資訊,如果能夠被推導出來,就不應該單獨的設計乙個欄位來存放(能盡量外來鍵join就用外來鍵join)。很多時候,我們為了滿足第三正規化往往會把一張表分成多張表。
2、索引
索引是一種資料結構。資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用b樹及其變種b+樹。更通俗的說,索引就相當於目錄。
①、b樹與b+樹的區別簡單分析
在mysql建立索引時,如果使用b樹,那麼b樹的結點既儲存鍵,也儲存資料,在空間一定的情況下,儲存的資料量就變小;而對於b+樹來說,非葉子節點是不儲存資料的,所以b+樹就可以存放更多的鍵。換句話說b+樹葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結。
正因為b+樹所有的資料都存放在葉子節點,所以b+樹也更適合做範圍查詢。
②、聯合索引最左字首匹配原因:
對於聯合索引如(a,b,c),索引的排序為先按照a排序,在按照b排序,最後按照c排序,如果使用的過程中不遵循最左字首,就不會使用索引而導致全表掃瞄。
③、索引覆蓋
如果要查詢的字段都建立過索引,那麼引擎會直接在索引表中查詢而不會訪問原始資料(否則只要有乙個字段沒有建立索引就會做全表掃瞄),這叫索引覆蓋。因此我們需要盡可能的在select後只寫必要的查詢字段,以增加索引覆蓋的機率。通俗點說就是索引覆蓋不需要回表查詢。
注意:非聚簇索引也不一定會引起回表查詢,這涉及到查詢語句所要求的字段是否全部命中了索引,如果全部命中了索引,那麼就不必再進行回表查詢。
3、mysql主鍵的選取
mysql表主鍵一般選擇自增的id,mysql會把資料按照鍵值的大小進行順序排列,這時主鍵是按照一種緊湊的接近順序寫入的方式儲存資料。而如果使用其他型別字段作為主鍵,可能不是自增的,mysql在插入資料的時候可能會導致為了將資料插入到合適的位置而不得不移動之前的某些資料,這些會造成額外的開銷,是沒有必要的,也是可以通過合適的選擇主鍵避免的。
4、悲觀鎖與樂觀鎖
推薦閱讀:面試題之資料庫
ubuntu ssh 相關問題記錄
1 在做linux開發過程中經常會用到遠端連線和遠端檔案拷貝 windows端常用的工具有xshell和xftp xshell可以遠端連線到linux的 伺服器 主機或者虛擬機器,而且可以像操作linux主機的終端一樣進行命令列操作。xftp 可以和遠端linux伺服器 主機 虛擬機器等進行檔案拷貝...
Mysql問題記錄
1.limit分頁運算 limit分頁時不能在分頁中做運算,所以可以這樣寫 set a concat select a.from select count 1 over as count,name,weight from dwd hospital region statistics where ty...
opencv編譯相關問題記錄
在編譯opencv時,一般都是編譯成為動態庫,但是有時為了方便移植或者在其他地方安裝,會需要將其編譯成靜態庫的形式。這個時候只需要將cmake的 build shared libs 引數設為 off即可 可以採用如下命令來進行編譯 cmake d cmake build type release d...