MySQl中JOIN後面的子查詢語句得到的結果叫做「視圖」嗎?
這是一位工作多年的同事告訴我的。他說這種情況下,這個「視圖」用不到索引,速度會比較慢。可是在我的印象中,「視圖」應該是那種通過create view語句創建出來的東西才叫做視圖啊!我同事說的話對不對?
mysql聽說都是幾大流行資料庫裡面最爛的,情況怎麼樣不太了解。如果是oracle或者sqlserver的話,他未必會真的查詢出子語句之後再來做join,所以也就無所謂什麼沒有用上索引的這個問題。
P.S.
對sqlserver是否用上索引不清楚的話,請使用Extended Events來抓log(逃
是否使用索引取決於JOIN連起來的欄位上是否有索引,如果有,則速度很快。
Mysql使用 Nested Join 來解決JOIN的問題,即首先讀第一張表的一行,然後找連接的第二張表的對應行,以此類推。Mysql本身會按照效率最高的順序來決定JOIN的順序,當然如果JOIN的層數過多的時候,這個效率最高的順序的計算也需要時間的。
如果JOIN的是一個子查詢,子查詢的索引取決於子查詢本身,Mysql5.6之後已經有做這個的BKA優化了,可以在join時使用子查詢原來那張表的索引
實踐中:
- 用EXPLAIN查看SQL的執行順序、使用到的索引、掃過的行數,從而具體行數具體分析。extra列出現Using join buffer (Block Nested Loop)則意味著使用到了BKA優化
- 如果不是大神,不要試圖挑戰資料庫的效率,那上面至少凝結了幾萬個人月(按大幾百活躍貢獻者*項目時長 來算的)。遇到好多個喜歡把所有表全部拉下來自己做where和join的同事了
(關係)理論上應該只要經過了選擇和/或投影的都叫視圖吧。。。
CREATE VIEW裡面也有一個SELECT語句啊。。。
說實話,這種寫法我沒聽說過,頭次見.
那個叫"子查詢".mysql子查詢和主查詢的連接方式奇怪.是把主查詢結果放到子查詢裡面去走一遍(就是變成EXISTS).所以會很慢.
另外查詢分析器畢竟會做各種優化.用沒用索引還是看執行計劃為好.
推薦閱讀:
※將開源軟體(比如mysql)的源碼進行修改後必須也開源嗎?
※MySQL成數據勒索新目標,開發4步自查
※MySQL訓練——Self join@sqlzoo.net
※SQL中 LEFT JOIN ON 條件的效率高低比較?