面試官:你的 SQL 一般有幾個 join? | 原力計劃

2021-02-21 程序人生

total總內存

used已用內存

free空閒內存

buff/cache已使用的緩存

avaiable可用內存

面試官:那你知道怎麼清理已使用的緩存嗎(buff/cache)?面試官:sync; echo 3 > /proc/sys/vm/drop_caches就可以清理buff/cache了,你說說我在線上執行這條命令做好不好?我:(送分題,內心大喜)好處大大的有,清理出緩存我們就有更多可用的內存空間, 就跟pc上面xx衛士的小火箭一樣,點一下,就釋放出好多的內存。SQL 中的 Join 可以根據某些條件把指定的表給結合起來並將數據返回給客戶端。面試官:在項目開發中如果需要使用 Join 語句,如何優化提升性能?面試官:可以總結為 Join 語句是相對比較耗費性能,對嗎?我: 在執行 Join 語句的時候必然要有一個比較的過程。我:逐條比較兩個表的語句是比較慢的,因此我們可以把兩個表中數據依次讀進一個內存塊中, 以 MySQL的InnoDB 引擎為例,使用以下語句我們必然可以查到相關的內存區域 show variables like 『%buffer%』如圖所示 Join_buffer_size的大小將會影響我們 Join 語句的執行性能。我:任何項目終究要上線,不可避免的要產生數據,數據的規模又不可能太小。我:大部分資料庫中的數據最終要保存到硬碟上,並且以文件的形式進行存儲。InnoDB 以頁(page)為基本的IO單位,每個頁的大小為16KB, InnoDB 會為每個表創建用於存儲數據的 .ibd 文件。我:這意味著我們有多少表要連接就需要讀多少個文件,雖然可以利用索引,但還是免不了頻繁的移動硬碟的磁頭。我:是的,現在的開源框架不都喜歡說自己通過順序讀寫大大的提升了性能嗎,比如 hbase、kafka。面試官:說的沒錯,那你認為 Linux 有對此做出優化嗎?提示,你可以再執行一次 Free 命令看一下。面試官:你有沒有想過?buff/cache 裡面存的是什麼?為什麼 buff/cache 佔了那麼多內存,可用內存即 availlable 還有1.1G?為什麼你可以通過兩條命令來清理 buff/cache 佔用的內存,而想要釋放used只能通過結束進程來實現?我:這麼隨便就釋放了 buff/cache 所佔用的內存,說明它就不重要, 清除它不會對系統的運行造成影響我:難道是?想起來《CSAPP》(深入理解計算機系統)裡面說過一句話:存儲器層次結構的本質是,每一層存儲設備都是較低一層設備的緩存。通俗來說,就是說 Linux 會把內存當作是硬碟的高速緩存。面試官:再給你個機會,如果讓你來實現 Join 算法你會怎麼做?我:無索引的話,嵌套循環就完事了嗷。有索引的話,則可以利用索引來提升性能。面試官:說回 Join_buffer 你認為 Join_buffer 裡面存儲的是什麼?我:在掃描過程中,資料庫會選擇一個表把他要返回以及需要進行和其他表進行比較的數據放進 Join_buffer。我:這個就比較簡單了,直接讀取兩個表的索引樹進行比較就完事了,我這邊介紹一下無索引的處理方式:嵌套循環,每次只讀取表中的一行數據,也就是說如果 outerTable有10萬行數據, innerTable 有100行數據,需要讀取10000000次(假設這兩個表的文件沒有被作業系統給緩存到內存, 我們稱之為冷數據表)。Block塊,也就是說每次都會取一塊數據到內存以減少I/O的開銷。當沒有索引可以使用的時候,MySQL InnoDB 就會使用這種算法。當無法使用索引執行 Join 操作的時候,InnoDB 會自動使用Block nested loop 算法。上學時,資料庫老師最喜歡考資料庫範式,直到上班才學會一切以性能為準,能冗餘就冗餘,實在冗餘不了的就 Join 如果 Join 真的影響到性能。試著調大你的 Join_buffer_size , 或者換固態硬碟。版權聲明:本文為CSDN博主「Java發財」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本聲明。原文連結:https://blog.csdn.net/weixin_47067712/article/details/1059726206月2日20:00,CSDN 創始人&董事長、極客幫創投創始合伙人蔣濤攜手全球頂級開源基金會主席、董事,聚焦中國開源現狀,直面開發者在開源技術、商業上的難題,你絕不可錯過的開源巔峰對談!立即免費圍觀

更多精彩推薦

☞你的 AI 程序無人問津?不是不夠好,而是缺一個展示的舞臺

☞航拍高手、吉他十級,6500+Star 開源項目作者,後浪程式設計師給力!

☞5 月程式語言排行榜:C 重回第一,今年程式語言名人堂冠軍還會是它嗎? | 原力計劃

☞基於深度學習和傳統算法的人體姿態估計,技術細節都講清楚了

☞面試中遇到這 3 個SQL問題,最容易掉坑裡!

☞好撲科技結合區塊鏈行業發展趨勢,重磅推出「好撲區塊鏈合伙人」計劃

點擊閱讀原文,精彩繼續。

相關焦點

  • 面試官:你的SQL一般有幾個join?​
    >em…., 回去等通知吧再談SQL Join面試官:換個話題,談談你對join的理解我:好的(再答錯就徹底完了,把握住機會)回顧SQL中的join可以根據某些條件把指定的表給結合起來並將數據返回給客戶端join的方式有inner join 內連接
  • 靈魂拷問:你寫的SQL一般有幾個join ?​
    >em…., 回去等通知吧再談SQL Join面試官:換個話題,談談你對join的理解我:好的(再答錯就徹底完了,把握住機會)回顧SQL中的join可以根據某些條件把指定的表給結合起來並將數據返回給客戶端join的方式有inner join 內連接
  • 面試官靈魂一問: 為什麼 SQL 語句不要過多的 join?
    送分題面試官:有操作過Linux嗎?...., 回去等通知吧再談SQL Join面試官:換個話題,談談你對join的理解我:好的(再答錯就徹底完了,把握住機會)回顧SQL中的join可以根據某些條件把指定的表給結合起來並將數據返回給客戶端join的方式有:5 種
  • 面試必知的 Spark SQL 幾種 Join 實現
    SparkSQL總體流程介紹在闡述Join實現之前,我們首先簡單介紹SparkSQL的總體流程,一般地,我們有兩種方式使用SparkSQL,一種是直接寫sql語句,這個需要有元資料庫支持,例如Hive等,另一種是通過Dataset/DataFrame編寫Spark應用程式。
  • 面試官:left join 後用 on 和 where 有什麼區別?
    哈嘍,我是狗哥。
  • Spark SQL 之 Join 實現
    SparkSQL總體流程介紹在闡述Join實現之前,我們首先簡單介紹SparkSQL的總體流程,一般地,我們有兩種方式使用SparkSQL,一種是直接寫sql語句,這個需要有元資料庫支持,例如Hive等,另一種是通過Dataset/DataFrame編寫Spark應用程式。
  • 【面試必備】SQL中left join、right join、inner join的區別
    sql語句如下:select * from Aleft join B on A.aID = B.bID結果如下:aID     aNum     bID     bName1     a20050111    1     20060324012     a20050112    2     2006032402
  • 15家面試、幾個offer,面試歷程分享
    >單元測試,確定執行時間,或者線上列印sql的執行時間問(總結):有些sql的話,不能通過測試環境測出性能的,必須上生產,因為生產有大數據通過生產環境的反饋可以知道sql性能問:資料庫的話用的mybatis,mybatis的sql有幾種方式答:編程式(java代碼
  • 為什麼代碼規範要求SQL語句不要過多的join?
    我:(送分題,內心大喜)好處大大的有,清理出緩存我們就有更多可用的內存空間, 就跟pc上面xx衛士的小火箭一樣,點一下,就釋放出好多的內存面試官:em…., 回去等通知吧再談SQL Join面試官:換個話題,談談你對join的理解
  • 飯可以多吃,SQL JOIN 要少用
    轉自:https://juejin.im/post/5e0443ae6fb9a0162277a2c3送分題面試官:有操作過Linux嗎?面試官: 那你說一下用free命令都可以看到啥信息我: 那,如下圖所示 可以看到內存以及緩存的使用情況面試官: 那你知道怎麼清理已使用的緩存嗎(buff/cache)
  • SQL語句別再帶過多的JOIN了,這樣寫才優秀!
    送分題面試官:有操作過Linux嗎?…., 回去等通知吧再談SQL JOIN面試官:換個話題,談談你對join的理解我:好的(再答錯就徹底完了,把握住機會)回顧SQL中的join可以根據某些條件把指定的表給結合起來並將數據返回給客戶端join的方式有inner join 內連接
  • 上兩個月,15家面試,幾個offer , 我的面試歷程!
    sql語句寫的好壞答:單元測試,確定執行時間,或者線上列印sql的執行時間問(總結):有些sql的話,不能通過測試環境測出性能的,必須上生產,因為生產有大數據通過生產環境的反饋可以知道sql性能問:資料庫的話用的mybatis,mybatis的sql有幾種方式
  • SQL語言中,inner join 、left join 、right join和full join的定義和圖示
    sql中的連接查詢有inner join(內連接)、left join(左連接)、right join(右連接)、full join(全連接)四種方式,它們之間其實並沒有太大區別,僅僅是查詢出來的結果有所不同。 例如我們有兩張表:
  • 程式設計師真實面試經歷:15家公司,幾個offer
    >單元測試,確定執行時間,或者線上列印sql的執行時間問(總結):有些sql的話,不能通過測試環境測出性能的,必須上生產,因為生產有大數據通過生產環境的反饋可以知道sql性能問:資料庫的話用的mybatis,mybatis的sql有幾種方式答:編程式(java代碼
  • 吊打面試官?2020 年資料庫高頻面試題|原力計劃
    在設計資料庫結構的時候,要儘量遵守三範式,如果不遵守,必須有足夠的理由。比如性能。事實上我們經常會為了性能而妥協資料庫的設計。5、MySQL有關權限的表都有哪幾個MySQL伺服器通過權限表來控制用戶對資料庫的訪問,權限表存放在mysql資料庫裡,由mysql_install_db腳本初始化。
  • 這些SQL技能你都會嗎? 經典SQL面試題送給你(附答案)
    儘管面試官虐我千百遍,我還待他如初戀。
  • mysql┃多個角度說明sql優化,讓你吊打面試官!
    moon在之前的公司就有這樣的問題,一條sql語句要連5張表,正常一個查詢下來可能要1分多鐘,所以這條sql太重了,而在moon的細心觀察下發現,其中兩張表都只用到了其中一個欄位,然後我就和DBA商量下將這兩個欄位冗餘到了其它的兩個表中(業務有關聯),結果這條sql語句的執行時間就變成了十幾秒。
  • SQL面試常考題有哪些?
    SQL面試考核的內容和範圍有哪些? 關於SQL的考核內容,首先當然是一些high-level的概念,比如view和table的區別,inner join和outer join的區別等等。需要注意的是,在最近的面試中,有的公司第一輪的HR面試也開始考察SQL的基礎概念了,可能是因為競爭越來越激烈了,公司想在第一輪提高篩選的效率。題一般不會很難,但是建議同學們心中有數,不要遇到這種情況的時候突然懵掉。
  • 面試官:Java中Thread的join方法為什麼能讓線程插隊?
    你知道的越多,不知道的就越多,業餘的像一棵小草!你來,我們一起精進!你不來,我和你的競爭對手一起精進!
  • mysql 如何優化left join
    優化的問題,搞了一下午,中間查了不少資料,對MySQL的查詢計劃還有查詢優化有了更進一步的了解,做一個簡單的記錄: select c.* from hotel_info_original c left join hotel_info_collection h on c.hotel_type=h.hotel_type