1.on 后面的條件和where 后面的條件的區別
查詢語句開始 會根據 on后面的條件創建一張虛擬表,左邊表是全部數據,右邊表會根據on后面的條件進行篩選。
然后再根據where后面的條件進行篩選虛擬表中的數據作為最終數據
所以如果是篩選右表中的條件 放在了where 中則則會過濾掉 部分左表中的數據
結論:篩選右表的條件和左右表關聯的條件寫在on中 篩選左表的條件寫在where中
2.右表中的條件放在on中 如果右表的數據量很大的情況下會有很長的查詢時間 是因為創建虛擬表的時候由於數據量大 查詢條件沒有索引造成的 所以相應的增加索引進行查詢。
3.創建索引
alter table tableName add Index indexName(clum);
ALTER TABLE optable_task_item ADD INDEX task_id ( `task_id` );
4.那么where 中的條件創建索引時候有用呢?
5.mysql 的主鍵索引是聚集索引 采用b+tree的數據結構,和btree的區別是 b+樹的data地址放置在葉子節點上,子節點上的主鍵個數根據區域分開 可以更快的定位id 普通索引是非聚集索引,索引下面對應的是主鍵 ,找到到主鍵后在去查詢主鍵索引表中查詢數據。聯合索引兩個索引是都存儲在索引變中的,所以部分情況下是不去查找索引表的。
6.索引的數據類型分為兩種 tree 和hash桶 hash桶一般情況下查找的時間復雜度是 O(1) 但是限制於等值查找,對於范圍查找、模糊查詢 聯合索引的部分查找都不起作用,並且如果鍵值存在大量的重復,還是比較慢的。B+TREE 從根節點到葉子節點的高度不超過一,所以平均的查詢速度相差不大,桶層級之間的指針有索引關聯,可以左右同時查找。
7.為什么sql查詢中避免用 in 和or查詢 可能不能命中索引,在沒有索引的情況下,in是O(logn) or 是O(n)