MySQL小結

1.Mysql的索引採用B+Tree  B/B+樹又叫平衡多路查找樹
MySQL中,索引屬於存儲引擎級別的概念,常見的2個引擎是MyISAM和InnoDB(默認)。https://www.cnblogs.com/tgycoder/p/5410057.html
1).MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉結點data域保存了完整的數據記錄。
2).InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。
3).MyISAM的索引方式也叫做“非聚集”的,InnoDB的索引叫做聚集索引。

每個InnoDB表具有一個特殊的索引稱爲聚集索引,除了聚集索引之外的索引叫二級索引,又叫輔助索引。如果您的表上定義有主鍵,該主鍵索引是聚集索引。
如果你不定義爲您的表的主鍵時,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作爲主鍵,InnoDB使用它作爲聚集索引。如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個字節,而且是隱藏的,使其作爲聚簇索引。

度爲d的B-Tree(就是每個節點裏面的key的個數),設其索引N個key,則其樹高h的上限爲logd((N+1)/2),檢索一個key,其查找結點個數的漸進複雜度爲O(logdN)。

爲什麼mysql的索引使用B+樹而不是B樹呢??

(1)B+樹更適合外部存儲(一般指磁盤存儲),由於內節點(非葉子節點)不存儲data,所以一個節點可以存儲更多的內節點,每個節點能索引的範圍更大更精確。也就是說使用B+樹單次磁盤IO的信息量相比較B樹更大,IO效率更高。
(2)mysql是關係型數據庫,經常會按照區間來訪問某個索引列,B+樹的葉子節點間按順序建立了鏈指針,加強了區間訪問性,所以B+樹對索引列上的區間範圍查詢很友好。而B樹每個節點的key和data在一起,無法進行區間查找。

2.通過limit和offset 或只通過limit可以實現分頁功能。
SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset
代碼示例:
語句1:select * from student limit 9,4
語句2:slect * from student limit 4 offset 9
// 語句1和2均返回表student的第10、11、12、13行  
// 語句2中的4表示返回4行,9表示從表的第十行開始
//爲了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數爲 -1: 
mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96到最後的記錄.

3.on使用是sql需要出現inner,否則需要用where關鍵字
找出表中重複出現的Email: select Email from Person group by Email having count(Email)>1;
LeetCode 184: 找到每組薪水最高的信息:
SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM
    Employee
        JOIN
    Department ON Employee.DepartmentId = Department.Id
WHERE
    (Employee.DepartmentId , Salary) IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
    )
;
多列的等值比較: select * from employeer where (name,age) in (('李四',33),('hh',23)); 

LeetCode185: 查詢表裏薪水最高的3個人: 沒有用limit和order by
select e1.Name, e1.Salary
from Employee e1
where 3 >
(
    select count(distinct e2.Salary)
    from Employee e2
    where e2.Salary > e1.Salary
);

4.union all 和 union的區別
union all效率上比union快很多
1、對重複結果的處理:UNION在進行錶鏈接後會篩選掉重複的記錄,Union All不會去除重複記錄搜索。
2、對排序的處理:Union將會按照字段的順序進行排序;UNION ALL只是簡單的將兩個結果合併後就返回。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章