SQL-基本學習II-資料庫引擎與索引
阿新 • • 發佈:2018-12-28
目錄
這是SQL的第二篇,結合一些被面試的內容,對常考的資料庫問題進行一些總結。
SQL語法編寫
重複資料的一組查詢
有一張person表,其中有p_id,p_name;一張house表,其中有h_id,address;一張hire表,其中有hh_id、h_id、p_id;hire記錄了租房者租房的記錄,一個租房客可以租多個房子。設計一條sql,查詢租了多個房子的租房者姓名。
select p_name,count(*)
from hire
INNER JOIN person on hire.p_id = person.p_id
group by hire.p_id having count(*)>1;
假設京東商品表jd_sku中,price欄位表示價格,promote_price欄位表示促銷時期的價格。請用一條SQL語句實現;當前月份為6月份時,使用promote_price欄位代替price欄位
update jd_sku set promote_price = price
from jd_sku
where month = '6';
Mysql的資料引擎Innodb與Myisam的區別
事務支援、行鎖與表鎖、聚集索引與非聚集索引、全文索引
- 1.組成部分:Myisam的索引和資料是分開的,並且索引是有壓縮的,而Innodb是索引和資料放在一起,且沒有使用壓縮,因而Innodb比MyISAM體積更大。MyISAM每張表都包括三種檔案:表定義檔案(.frm)、資料檔案(.myd)和索引檔案(.myi),而Innodb通常許多表儲存在同一個檔案中。
- 2.Myisam沒事務而Innodb支援事務,支援事務的回滾。
- 3.MySQL表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨佔寫鎖(Table Write Lock)。
對MyISAM表進行讀操作時,它不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫操作;而對MyISAM表的寫操作,則會阻塞其他使用者對同一表的讀和寫操作。
InnoDB行鎖是通過給索引項加鎖來實現的,即只有通過索引條件檢索資料,InnoDB才使用行級鎖,否則將使用表鎖!行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源。
表級鎖,直接鎖定整張表,在你鎖定期間,其它程序無法對該表進行寫操作。如果你是寫鎖,則其它程序則讀也不允許
行級鎖, 僅對指定的記錄進行加鎖,這樣其它程序還是可以對同一個表中的其它記錄進行操作。 - 4.Myisam是非聚集索引,有專用的索引表而Innodb是聚集索引,根據物理儲存而建立的索引。
- 5.Myisam支援全文索引而Innodb不支援全文索引。倒排文件技術:建立一個詞出現的頻率和位置的庫。
關於索引
索引的優點
- 1.通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
- 2.可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。
- 3.可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
索引的缺點
- 1.建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
- 2.索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
- 3.當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
索引的實現原理 B樹與B+樹
在瞭解B樹與B+樹之前,先來解釋一下平衡二叉樹:
平衡二叉樹特點
- 非葉子節點最多擁有兩個子節點。
- 非葉子節點值大於左邊子節點、小於右邊子節點。
- 樹的左右兩邊的層級數相差不會大於1。
- 沒有值相等重複的節點。
B樹:平衡多路查詢樹
將平衡二叉樹變成多路,進而減少了樹的層級,提升了資料查詢的效率。
B+樹
應用:作業系統索引和資料庫索引
1.由於內部節點不儲存鍵值關聯的附屬資料,所以內部節點節省的空間可以存放更多的鍵值。也就意味著從磁碟存取一頁時可獲得更多的鍵值資訊。
2.葉節點形成了一個鏈,所以對樹的全掃描就是對所有葉節點的線性遍歷。
特點:
- 非葉子結點的子樹指標與關鍵字個數相同。
- 非葉子結點的子樹指標P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹。
- 為所有葉子結點增加一個鏈指標。
- 所有關鍵字都在葉子結點出現。