搜尋
首頁資料庫SQL為什麼程式碼規格要求SQL語句不要過多的join?

送分題

面試官:有操作過Linux嗎?

我:有的呀

面試官:我想查看記憶體的使用情況該用什麼指令

我:free 或top

#面試官:那你說一下用free指令都可以看到啥資訊

我:那,如下圖所示可以看到記憶體以及快取的使用情況

  • total 總記憶體

  • #used 已使用記憶體

  • free 空閒記憶體

  • buff/cache 已使用的快取

  • ##avaiable 可用記憶體

為什麼程式碼規格要求SQL語句不要過多的join?

#面試官:那你知道怎麼清理已使用的快取嗎(buff/cache)

我:em… 不知道

面試官:sync; echo 3 > /proc/sys/vm/drop_caches就可以清理buff/cache了,你說說我在線上執行這條指令做好不好?

為什麼程式碼規格要求SQL語句不要過多的join?

我:(送分題,內心大喜)好處大大的有,清理出緩存我們就有更多可用的內存空間, 就跟pc上面xx衛士的小火箭一樣,點一下,就釋放出好多的內存

面試官:em…., 回去等通知吧

#再談SQL Join

面試官:換個話題,談談你對join的理解

我:好的(再答錯就徹底完了,把握住機會)

回顧

#SQL中的join可以根據某些條件把指定的表結合起來並將資料傳回給客戶端

join的方式有

inner join 內連線

為什麼程式碼規格要求SQL語句不要過多的join?

#left join 左邊連線

為什麼程式碼規格要求SQL語句不要過多的join?

#right join 右邊連接

為什麼程式碼規格要求SQL語句不要過多的join?

full join 全連接

為什麼程式碼規格要求SQL語句不要過多的join?


#################### #圖片來源:https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html############

面試官:在專案開發中如果需要使用join語句,如何優化提升效能?

我:分為兩種情況,資料規模小的,資料規模大的。

面試官: 然後?

我:對於

1.資料規模較小全部乾進記憶體就完事了嗷

2.資料規模較大

  • #可以透過增加索引來最佳化join語句的執行速度

  • 可以透過冗餘資訊來減少join的次數

  • #盡量減少表格連結的次數,一個SQL語句表連接的次數不要超過5次

面試官:可以總結為join語句是相對比較耗費效能,對嗎?

我:是的

面試官: 為什麼?

緩衝區

我: 在執行join語句的時候必然要有一個比較的過程

面試官: 是的

我:逐條比較兩個表的語句是比較慢的,因此我們可以把兩個表中資料依次讀進一個記憶體區塊中, 以MySQL的InnoDB引擎為例,使用以下語句我們必然可以查到相關的記憶體區域show variables like '%buffer%'

為什麼程式碼規格要求SQL語句不要過多的join?

##如圖所示join_buffer_size的大小將會影響我們join語句的執行表現

#面試官: 除此之外呢?

##一個大前提

#我:

任何專案終究要上線,不可避免的要產生數據,數據的規模又不可能太小

面試官:

是這樣的

我:

大部分資料庫中的資料最終要保存到硬碟上,並且以檔案的形式進行儲存。

以MySQL的InnoDB引擎為例

  • #InnoDB以頁(page)為基本的IO單位,每頁的大小為16KB

  • InnoDB會為每個表建立用於儲存資料的.ibd檔案

為什麼程式碼規格要求SQL語句不要過多的join?

驗證

為什麼程式碼規格要求SQL語句不要過多的join?

我:這意味著我們有多少表要連接就需要讀多少個文件,雖然可以利用索引,但還是免不了頻繁的移動硬碟的磁頭

面試官:也就是說頻繁的移動磁頭會影響性能對吧

我:是的,現在的開源框架不都喜歡說自己透過順序讀寫大大的提升了效能嗎,比如hbase、kafka

面試官:說的沒錯,那你認為Linux有對此做出最佳化嗎?提示,你可以再執行一次free指令看一下

我:奇怪快取怎麼佔用了1.2G多

#

為什麼程式碼規格要求SQL語句不要過多的join?

為什麼程式碼規格要求SQL語句不要過多的join?

#圖片來源:https://www.linuxatemyram.com/

面試官:你有沒有想過

  • buff/cache 裡面存的是什麼?

  • 為什麼buff/cache 佔了那麼多內存,可用內存即availlable還有1.1G?

  • 為什麼你可以透過兩個指令來清理buff/cache佔用的內存,而想要釋放used只能透過結束進程來實現?

品,你細品

思考了幾分鐘後

為什麼程式碼規格要求SQL語句不要過多的join?

我:這麼隨便就釋放了buff/cache所佔用的內存,說明它就不重要, 清除它不會對系統的運行造成影響

面試官: 不完全對

我:難道是?想起來《CSAPP》(深入理解電腦系統)裡面說過一句話

記憶體層次結構的本質是,每一層儲存裝置都是較低一層裝置的快取

為什麼程式碼規格要求SQL語句不要過多的join?

通俗來說,就是說Linux會把記憶體當作是硬碟的快取問題

相關資料:http://tldp.org /LDP/sag/html/buffer-cache.html

面試官:現在知道那道送分題該怎麼回答了吧

我:我….

為什麼程式碼規格要求SQL語句不要過多的join?

Join演算法

面試官:再給你個機會,如果讓你來實作Join演算法你會怎麼做?

我:無索引的話,巢狀迴圈就完事了嗷。有索引的話,則可以利用索引來提升效能.

#

面試官:說回join_buffer 你認為join_buffer裡面儲存的是什麼?

我:在掃描過程中,資料庫會選擇一個表格把他要返回以及需要進行和其他表格進行比較的資料放進join_buffer

面試官:有索引的情況下是怎麼處理的?

我:這個就比較簡單了,直接讀取兩個表的索引樹進行比較就完事了嗷,我這邊介紹一下無索引的處理方式

Nested Loop Join

為什麼程式碼規格要求SQL語句不要過多的join?

#嵌套循環,每次只讀取表中的一行數據,也就是說如果outerTable有10萬行數據, innerTable有100行數據,需要讀取10000000次(假設這兩個表的檔案沒有被操作系統給緩存到內存, 我們稱之為冷數據表)

#當然現在沒啥資料庫引擎使用這種演算法(太慢了)

Block nested loop

為什麼程式碼規格要求SQL語句不要過多的join?

# #Block 區塊,也就是說每次都會取一塊資料到記憶體以減少I/O的開銷

當沒有索引可以使用的時候,MySQL InnoDB 就會使用這種演算法

考慮以下兩個表t_a 和t_b

為什麼程式碼規格要求SQL語句不要過多的join?

##。當無法使用索引執行join操作的時候,InnoDB會自動使用Block nested loop 演算法

為什麼程式碼規格要求SQL語句不要過多的join?

#總結

上學時,資料庫老師最喜歡考資料庫範式,直到上班才學會一切以效能為準,能冗餘就冗餘,實在冗餘不了的就join如果join真的影響到效能。試著調大你的join_buffer_size, 或換固態硬碟。

參考資料

《深入理解電腦系統》- 第6章記憶體層次結構

《Experiments and fun with the Linux disk cache》作者透過幾個例子來說明硬碟快取對程式執行效能的影響
《Linux ate my ram》 Free參數的解釋
How to clear the buffer/pagecache (disk cache) under Linux 文章開頭送分題指令的解釋
MySQL 是怎麼運作的:從根兒上理解MySQL
Block bested loop 來自MariaDB官方文件解釋了Block-Nested-Loop演算法的實作

以上是為什麼程式碼規格要求SQL語句不要過多的join?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:Java学习指南。如有侵權,請聯絡admin@php.cn刪除
SQL和數據庫:完美的合作夥伴關係SQL和數據庫:完美的合作夥伴關係Apr 25, 2025 am 12:04 AM

SQL與數據庫的關係是緊密結合的,SQL是管理和操作數據庫的工具。 1.SQL是一種聲明式語言,用於數據定義、操作、查詢和控制。 2.數據庫引擎解析SQL語句並執行查詢計劃。 3.基本用法包括創建表、插入和查詢數據。 4.高級用法涉及復雜查詢和子查詢。 5.常見錯誤包括語法、邏輯和性能問題,可通過語法檢查和EXPLAIN命令調試。 6.優化技巧包括使用索引、避免全表掃描和優化查詢。

SQL與MySQL:澄清兩者之間的關係SQL與MySQL:澄清兩者之間的關係Apr 24, 2025 am 12:02 AM

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。

SQL的重要性:數字時代的數據管理SQL的重要性:數字時代的數據管理Apr 23, 2025 am 12:01 AM

SQL在數據管理中的作用是通過查詢、插入、更新和刪除操作來高效處理和分析數據。 1.SQL是一種聲明式語言,允許用戶以結構化方式與數據庫對話。 2.使用示例包括基本的SELECT查詢和高級的JOIN操作。 3.常見錯誤如忘記WHERE子句或誤用JOIN,可通過EXPLAIN命令調試。 4.性能優化涉及使用索引和遵循最佳實踐如代碼可讀性和可維護性。

SQL入門:基本概念和技能SQL入門:基本概念和技能Apr 22, 2025 am 12:01 AM

SQL是一種用於管理和操作關係數據庫的語言。 1.創建表:使用CREATETABLE語句,如CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(100),emailVARCHAR(100));2.插入、更新、刪除數據:使用INSERTINTO、UPDATE、DELETE語句,如INSERTINTOusers(id,name,email)VALUES(1,'JohnDoe','john@example.com');3.查詢數據:使用SELECT語句,如SELEC

SQL:語言,MySQL:數據庫管理系統SQL:語言,MySQL:數據庫管理系統Apr 21, 2025 am 12:05 AM

SQL和MySQL的關係是:SQL是用於管理和操作數據庫的語言,而MySQL是支持SQL的數據庫管理系統。 1.SQL允許進行數據的CRUD操作和高級查詢。 2.MySQL提供索引、事務和鎖機制來提升性能和安全性。 3.優化MySQL性能需關注查詢優化、數據庫設計和監控維護。

SQL的作用:管理和操縱數據SQL的作用:管理和操縱數據Apr 20, 2025 am 12:02 AM

SQL用於數據庫管理和數據操作,核心功能包括CRUD操作、複雜查詢和優化策略。 1)CRUD操作:使用INSERTINTO創建數據,SELECT讀取數據,UPDATE更新數據,DELETE刪除數據。 2)複雜查詢:通過GROUPBY和HAVING子句處理複雜數據。 3)優化策略:使用索引、避免全表掃描、優化JOIN操作和分頁查詢來提升性能。

SQL:對數據管理的初學者友好方法?SQL:對數據管理的初學者友好方法?Apr 19, 2025 am 12:12 AM

SQL適合初學者,因為它語法簡單,功能強大,廣泛應用於數據庫系統。 1.SQL用於管理關係數據庫,通過表格組織數據。 2.基本操作包括創建、插入、查詢、更新和刪除數據。 3.高級用法如JOIN、子查詢和窗口函數增強數據分析能力。 4.常見錯誤包括語法、邏輯和性能問題,可通過檢查和優化解決。 5.性能優化建議包括使用索引、避免SELECT*、使用EXPLAIN分析查詢、規範化數據庫和提高代碼可讀性。

SQL在行動中:現實世界中的示例和用例SQL在行動中:現實世界中的示例和用例Apr 18, 2025 am 12:13 AM

SQL在實際應用中主要用於數據查詢與分析、數據整合與報告、數據清洗與預處理、高級用法與優化以及處理複雜查詢和避免常見錯誤。 1)數據查詢與分析可用於找出銷售量最高的產品;2)數據整合與報告通過JOIN操作生成客戶購買報告;3)數據清洗與預處理可刪除異常年齡記錄;4)高級用法與優化包括使用窗口函數和創建索引;5)處理複雜查詢可使用CTE和JOIN,避免常見錯誤如SQL注入。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能