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只是簡單的將兩個結果合併後就返回。