首頁 資料庫 SQL SQL查詢如何最佳化? (詳解)

SQL查詢如何最佳化? (詳解)

Nov 30, 2019 pm 05:54 PM
sql查詢

SQL查詢如何最佳化? (詳解)

為什麼要最佳化

系統的吞吐量瓶頸往往會出現在資料庫的存取速度上,也就是隨著應用程式的運行,資料庫的中的資料會越來越多,處理時間會相應變慢,且資料是存放在磁碟上的,讀寫速度無法和記憶體相比

##如何最佳化

1、設計資料庫時:資料庫表、欄位的設計,儲存引擎

#2、利用好MySQL本身提供的功能,如索引,語句寫法的調優

3、MySQL叢集、分庫分錶、讀寫分離

關於SQL語句的最佳化的方法方式,網路有很多經驗,所以本文拋開這些,設法在DAO層的最佳化和資料庫設計最佳化上建樹,並列舉兩個簡單實例

例子1:ERP查詢最佳化

現況分析:

1、缺少關聯索引

2、Mysql本身的效能所限,對多個表的關聯支援不好,目前的效能主要集中在列表查詢上面,列表查詢關聯了許多表

應對方法:

1 增加必要的索引:透過explain查看執行記錄,依照執行計畫新增索引;

2 先統計業務資料主表主鍵,取得較小結果集,然後再利用結果集關聯查詢;
1) 先根據主表和條件查詢顯示業務資料的主鍵
2) 根據主鍵作為查詢條件,再關聯其他關聯表,查詢需要的業務欄位
3 ) 在主表查詢時,針對需要關聯其他表的查詢條件,需要做只有設定這個條件,才會做表格關聯的設定

例如 有如下表 TT_A   TT_B    TT_C  TT_D

假设未优化前的SQL是这样的

SELECT
    A.ID,
    ....
    B.NAME,
    .....
    C.AGE,
    ....
    D.SEX
    .....

FROM  TT_A A
LEFT JOIN TT_B B ON A.ID  = B.ITEM_ID
LEFT JOIN TT_C C ON B.ID = C.ITEM_ID
LEFT JOIN TT_D D ON C.ID = D.ITEM_ID
WHERE 1=1AND A.XX = ?AND A.VV = ?.....

那么优化后的SQL是

第一步

SELECT
    A.ID

FROM  TT_A A
WHERE 1=1AND A.XX = ?AND A.VV = ?第二步

SELECT
    A.ID,
    ....
    B.NAME,
    .....
    C.AGE,
    ....
    D.SEX
    .....
FROM  ( SELECT A.ID,..... FROM  TT_A  WHERE ID IN (1,2,3..)  ) A
LEFT JOIN TT_B B ON A.ID  = B.ITEM_ID
LEFT JOIN TT_C C ON B.ID = C.ITEM_ID
LEFT JOIN TT_D D ON C.ID = D.ITEM_ID
WHERE 1=1AND A.XX = ?AND A.VV = ?
登入後複製

小結:
##這種最佳化適用於,列表查詢,因為一個列表查詢的條件一般都是和主表掛鉤的,所以利用這一點,建立關鍵字段索引,同時通過查詢條件的限制大大的縮小主表的數據量。這樣關聯其他表的時候就會快的多

範例2:文章搜尋優化

#假設你要做個貼吧的文章搜尋功能,最簡單直接的儲存結構,就是利用關係資料庫,創建這樣一個儲存文章的關係資料庫表TT_ARTICLES:

 

那麼,假如現在的搜尋關鍵字是“目標”,我們就可以利用字串匹配的方式來對CONTENT 列進行匹配查詢:

select * from ARTICLES where CONTENT like '% 目标 %';
登入後複製

這很容易就實現了搜尋功能。但是,這樣的方式有著明顯的問題,即使用 % 來進行字串匹配是非常低效的,因此這樣的查詢需要遍歷整個表(全表掃描)。幾篇、幾十篇文章的時 候,還不是什麼問題,但是如果有幾十萬、幾百萬的文章,這種方式是完全不可行的。且不說單獨的關係資料庫表就不能容納那麼大的資料了,就是能夠容納,要掃描一遍,這裡的時間代價是難以想像的


於是,我們就要引入「倒排索引」的技術了。在前面所述的場景下, 我們可以把這個概念拆分為兩個部分來解釋: 好,那上面的ARTICLES 表依然存在,但現在需要添加一個關鍵字表KEYWORDS,並且,KEYWORD 列需要添加索引,因此這條關鍵字的記錄可以快速找到:

當然,我們還需要一個關聯關係表把KEYWORDS 表和ARTICLES 表結合起來, KEYWORD_ID 和ARTICLE_ID 作為聯合主鍵 

你看,這其實是一個多對多的關係,也就是同一個關鍵字可以出現在多​​篇文章中,而一篇文章可以包含多個不同的關鍵字。這樣,我們可以先根據被索引了的關鍵字,從 KEYWARDS 表 中找到對應的 KEYWORD_ID,進而根據它在上面的關聯關係表找到 ARTICLE_ID,再根據 它去 ARTICLES 表中找到對應的文章。

小結:

這看起來是三次查找,但是因為每次都走索引,就免去了全表掃描,在資料量較小的時候速度並不慢,而且,在使用SQL 實作的時候,這個過程完全可以放到一個SQL 語句中。在數 據量較小的時候,上面的方法已經夠好用了。這樣解決了全表掃描和字串 % 匹配查詢造成的效能問題。

總結:

在技術面試的時候,如果你能舉出實際的例子,或者是直接說自己開發過程的問題和收穫會讓面試分會加很多,回答邏輯性也要強一點,不要東一點西一點,容易把自己都繞暈的。例如,問為怎麼優化SQL你不要一上來就直接回答加索引,你可以這樣回答:

面試官您好,首先我們的專案DB資料量遇到了瓶頸,導致清單查詢非常緩慢,給使用者的體驗不好,為了解決這個問題,有很多種方法,例如最基本的資料庫表設計,基本的SQL優化,MYSQL的集群,讀寫分離,分庫分錶,架構上增加緩存層等,他們的優缺點……,綜合這些然後再結合我們項目特點,最後我們在技術選型的時候選了誰。

如果你這樣有條不紊,有理有據的回答了問題而且還說出這麼多問題外的知識點,面試官會覺得你不只是一個會寫代碼的人,而是你邏輯清晰,你對科技選型,有自己的理解與思考

本文來自 SQL教學 專欄,歡迎學習!

以上是SQL查詢如何最佳化? (詳解)的詳細內容。更多資訊請關注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)

美團面試題:慢SQL有遇過嗎?是怎麼解決的? 美團面試題:慢SQL有遇過嗎?是怎麼解決的? Aug 24, 2023 pm 03:41 PM

MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄MySQL中查詢時間超過(大於)設定閾值(long_query_time)的語句,記錄到慢查詢日誌中。

PHP和PDO: 如何執行複雜的SQL查詢語句 PHP和PDO: 如何執行複雜的SQL查詢語句 Jul 28, 2023 pm 03:43 PM

PHP和PDO:如何執行複雜的SQL查詢語句在處理資料庫操作時,PHP提供了一個強大的擴充函式庫PDO(PHPDataObjects),用於簡化與資料庫的互動。 PDO支援多種資料庫,如MySQL、SQLite等,同時也提供了豐富的功能和方法,方便開發人員進行各種資料庫操作。本文將介紹如何使用PDO執行複雜的SQL查詢語句,並附上對應的程式碼範例。連接資料庫

PHP程式設計有哪些常見的表格操作? PHP程式設計有哪些常見的表格操作? Jun 12, 2023 am 09:46 AM

在Web開發中,表格是最基本也是最常用的一個元素,而PHP是一種流行的伺服器端程式語言,在表格操作中有許多常見的技巧和方法。本文將介紹PHP程式設計中常見的表格操作。顯示資料表格在PHP中,可以使用HTML中的表格標籤來顯示資料表格,值得注意的是,表格必須在PHP腳本中產生。以下是基本的HTML表格標籤範例:<table><tr>

PHP查詢語句使用範例 PHP查詢語句使用範例 Mar 23, 2024 am 11:27 AM

PHP是一種功能強大的伺服器端腳本語言,廣泛應用於Web開發。在Web開發中,我們常常需要與資料庫互動,執行查詢語句來取得資料。本文將為您介紹PHP中如何編寫查詢語句以及使用範例。 1.連接資料庫在使用PHP進行資料庫查詢之前,首先需要建立與資料庫的連線。一般情況下,我們會使用MySQL資料庫作為範例,連接資料庫的程式碼如下:$servername=

為什麼我的Go程式在執行SQL查詢時出錯? 為什麼我的Go程式在執行SQL查詢時出錯? Jun 09, 2023 pm 06:10 PM

在Go語言程式設計中,使用SQL查詢是常見的任務。然而,有時在執行SQL查詢時會出現錯誤,導致程式無法正確執行。為了解決這些錯誤,我們需要深入了解SQL查詢和Go語言的互動方式。以下是一些可能出現的錯誤和對應的解決方法。缺少資料庫驅動在Go語言中,您需要使用特定的資料庫驅動程式來連接和操作資料庫。如果您嘗試執行資料庫查詢,而未正確安裝和設定該資料庫驅動程式

如何在PHP開發中最佳化SQL查詢語句和索引使用? 如何在PHP開發中最佳化SQL查詢語句和索引使用? Nov 02, 2023 pm 12:12 PM

如何在PHP開發中最佳化SQL查詢語句和索引使用?在PHP開發中,資料庫查詢是非常常見的操作。然而,當資料量增加時,查詢效能可能受到影響,導致應用程式變慢。為了提高查詢效能,我們需要最佳化SQL查詢語句和索引的使用。本文將介紹一些最佳化技巧和最佳實踐,以協助您在PHP開發中提升SQL查詢效能。一、使用正確的索引:索引是資料庫中提高查詢效能的重要組成部分。在設計數據

PHP程式設計中的多數SQL查詢效率最佳化實踐 PHP程式設計中的多數SQL查詢效率最佳化實踐 Jun 23, 2023 am 10:37 AM

隨著網路技術的發展,PHP程式設計已經成為了許多公司網站開發的主流。在PHP程式設計中,SQL查詢效率是需要每個程式設計師關注與處理的問題。 SQL查詢效率低會導致網站反應緩慢、系統負載過高或產生其他不友善的效果。因此,本文將著重介紹PHP程式設計中多種SQL查詢效率最佳化實踐,以提高程式的執行效率和整個系統的回應速度。資料庫索引資料庫索引是提高資料庫查詢速度的一種基本方法

PHP語言開發如何處理SQL查詢錯誤? PHP語言開發如何處理SQL查詢錯誤? Jun 09, 2023 pm 06:13 PM

PHP語言是一種常用的伺服器端腳本語言,用於網站開發等領域。在PHP語言開發中,SQL查詢是常見的操作,但由於各種原因,SQL查詢可能會出現錯誤。因此,開發人員需要在程式碼中處理這些錯誤,以確保應用程式的穩定性和正確性。一般來說,在PHP語言中處理SQL查詢錯誤有以下幾種常見的方式:1.使用try/catch區塊處理異常在PHP語言中,可以使用try/catch

See all articles