mysql索引及sql执行顺序
1, 紅黑樹 同一層級的黑樹到根結點經歷的黑樹數目一樣 最壞情況的時間復雜度 lg n 是二叉樹
b樹 結點可以有多個孩子 b+樹 父節點不存儲數據
聚集索引)的葉子節點會存儲數據行,也就是說數據和索引是在一起 非聚集索引存儲的是數據行的指針
2,InnoDB存儲引擎支持兩種常見的索引。
一種是B+樹,一種是哈希。
所有記錄的節點都在葉節點中,并且是順序存放的
所有記錄節點都是按照鍵值的大小順序存放在同一層的葉節點中,各個葉子節點通過指針進行連接。由于一個節點中存放了多條的數據,那么檢索的時候,進行的磁盤IO次數將會少掉很多
3,like 'abc%'會去索引中找 '%abc'不會
復合索引 使用第一部分才會使用索引
索引單獨使用,否則不使用索引 or and
索引缺點 占空間 增加刪除耗時
頻繁更新的不適合索引 sex值類型少不適合,
4,InnoDB存儲引擎的邏輯存儲結構和 Oracle大致相同 ,所有數據都被邏輯地存放在一個空間中 ,我們稱之為表空間 ( tablespace ) 。表空間又由段 ( segment ) 、區 ( extent ) 、頁 ( page ) 組成 。頁在一些文檔中有時也稱為塊(block)?
?執行順序
示例SQL:
SELECT * FROM user LEFT JOIN order ON user.id = order.uid WHERE order.price > 1000 GROUP BY user.name HAVING count(1) > 5 ORDER BY user.name LIMIT 0,10
1.FROM(將最近的兩張表,進行笛卡爾積)---VT1
2.ON(將VT1按照它的條件進行過濾)---VT2
3.LEFT JOIN(保留左表的記錄)---VT3
4.WHERE(過濾VT3中的記錄)--VT4…VTn
5.GROUP BY(對VT4的記錄進行分組)---VT5
6.HAVING(對VT5中的記錄進行過濾)---VT6
7.SELECT(對VT6中的記錄,選取指定的列)--VT7
8.ORDER BY(對VT7的記錄進行排序)--游標
9.LIMIT(對排序之后的值進行分頁)
?WHERE條件執行順序(影響性能)
1.MYSQL:從左往右去執行WHERE條件的。
2.Oracle:從右往左去執行WHERE條件的。
?結論:寫WHERE條件的時候,優先級高的部分要去編寫過濾力度最大的條件語句。
轉載于:https://www.cnblogs.com/song-9527/p/10647998.html
總結
以上是生活随笔為你收集整理的mysql索引及sql执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 中的文件锁
- 下一篇: ORACLE数据库在导入导出时序列不一致