目錄
送分題" >送分題
#再談SQL Join" >#再談SQL Join
回顧" >回顧
緩衝區" >緩衝區
Join演算法" >Join演算法
首頁 資料庫 SQL 為什麼程式碼規格要求SQL語句不要過多的join?

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

Jul 26, 2023 pm 04:51 PM
sql

送分題

面試官:有操作過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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Hibernate 框架中 HQL 和 SQL 的差異是什麼? Hibernate 框架中 HQL 和 SQL 的差異是什麼? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

Oracle SQL中除法運算的用法 Oracle SQL中除法運算的用法 Mar 10, 2024 pm 03:06 PM

《OracleSQL中除法運算的用法》在OracleSQL中,除法運算是常見的數學運算之一。在資料查詢和處理過程中,除法運算可以幫助我們計算欄位之間的比例或得出特定數值的邏輯關係。本文將介紹OracleSQL中除法運算的用法,並提供具體的程式碼範例。一、OracleSQL中除法運算的兩種方式在OracleSQL中,除法運算可以用兩種不同的方式來進行

Oracle與DB2的SQL語法比較與區別 Oracle與DB2的SQL語法比較與區別 Mar 11, 2024 pm 12:09 PM

Oracle和DB2是兩個常用的關聯式資料庫管理系統,它們都有自己獨特的SQL語法和特性。本文將針對Oracle和DB2的SQL語法進行比較與區別,並提供具體的程式碼範例。資料庫連接在Oracle中,使用以下語句連接資料庫:CONNECTusername/password@database而在DB2中,連接資料庫的語句如下:CONNECTTOdataba

詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

SQL中的identity屬性是什麼意思? SQL中的identity屬性是什麼意思? Feb 19, 2024 am 11:24 AM

SQL中的Identity是什麼,需要具體程式碼範例在SQL中,Identity是一種用於產生自增數字的特殊資料類型,它常用於唯一識別表中的每一行資料。 Identity欄位通常與主鍵列搭配使用,可確保每筆記錄都有獨一無二的識別碼。本文將詳細介紹Identity的使用方式以及一些實際的程式碼範例。 Identity的基本使用方式在建立表格時,可以使用Identit

Springboot+Mybatis-plus不使用SQL語句進行多表新增怎麼實現 Springboot+Mybatis-plus不使用SQL語句進行多表新增怎麼實現 Jun 02, 2023 am 11:07 AM

在Springboot+Mybatis-plus不使用SQL語句進行多表添加操作我所遇到的問題準備工作在測試環境下模擬思維分解一下:創建出一個帶有參數的BrandDTO對像模擬對後台傳遞參數我所遇到的問題我們都知道,在我們使用Mybatis-plus中進行多表操作是極其困難的,如果你不使用Mybatis-plus-join這一類的工具,你只能去配置對應的Mapper.xml文件,配置又臭又長的ResultMap,然後再寫對應的sql語句,這種方法雖然看上去很麻煩,但具有很高的靈活性,可以讓我們

SQL出現5120錯誤怎麼解決 SQL出現5120錯誤怎麼解決 Mar 06, 2024 pm 04:33 PM

解決方法:1、檢查登入使用者是否具有足夠的權限來存取或操作該資料庫,確保該使用者俱有正確的權限;2、檢查SQL Server服務的帳戶是否具有存取指定檔案或資料夾的權限,確保該帳戶具有足夠的權限來讀取和寫入該文件或資料夾;3、檢查指定的資料庫文件是否已被其他進程打開或鎖定,嘗試關閉或釋放該文件,並重新運行查詢;4、嘗試以管理員身份運行Management Studio等等。

如何使用SQL語句在MySQL中進行資料聚合和統計? 如何使用SQL語句在MySQL中進行資料聚合和統計? Dec 17, 2023 am 08:41 AM

如何使用SQL語句在MySQL中進行資料聚合和統計?在進行資料分析和統計時,資料聚合和統計是非常重要的步驟。 MySQL作為一個功能強大的關聯式資料庫管理系統,提供了豐富的聚合和統計函數,可以很方便地進行資料聚合和統計操作。本文將介紹使用SQL語句在MySQL中進行資料聚合和統計的方法,並提供具體的程式碼範例。一、使用COUNT函數進行計數COUNT函數是最常用

See all articles