目錄
前言
SQL執行慢的原因
#1、EXPLAIN分析你的SELECT查詢
2、SELECT查詢必須指明欄位名稱
3、查詢一筆資料的時候,使用LIMIT 1
4、為搜尋的WHERE欄位建立索引
5、千萬不要使用ORDER BY RAND()
6、保證每張表都有一個主鍵ID
8、盡可能的使用NOT NULL
8、選擇合適的儲存引擎
9、把IP位址存為UNSIGNED INT
10、盡量不要在WHERE查詢時對字段進行null值判斷
11、盡量不要使用%前綴的LIKE模糊查詢
12、避免在WHERE查詢時對欄位進行表達式操作
14、減少不必要的排序
14、建議用JOIN代替子查詢
15、避免發生隱式類型轉換
16、避免多表查詢欄位類型不一致
17、建議開啟查詢快取
18、使用UNION取代暫存資料表
19、慎用IN查詢
20、歡迎補充
結束語
首頁 資料庫 mysql教程 mysql的20個最佳化總結

mysql的20個最佳化總結

Oct 08, 2018 pm 03:20 PM
synchronized

這篇文章帶給大家的內容是關於mysql的最佳化總結,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

前言

現如今,資料庫的運作越來越成為整個應用程式的效能瓶頸了,這點對於Web應用尤其明顯。所以,我整理了MySQL優化的幾點建議,希望這些優化技巧對您有用,總結不到的,歡迎大家來補充。

SQL執行慢的原因

  1. 網路速度慢,記憶體不足,I/O吞吐量小,磁碟空間滿了等硬體問題

  2. #沒有索引或索引失效

  3. 資料表裡的資料記錄過多

  4. 伺服器調優及各個參數設定也可能影響

  5. 開發者所寫的SQL效率

#1、EXPLAIN分析你的SELECT查詢

很多情況下,使用EXPLAIN關鍵字可以讓你知道MySQL是如何處理你的SQL語句的,這可以幫你分析你的查詢語句,或許能盡快找到的優化方法以及潛在的性能問題。具體EXPLAIN的使用以及各參數的意義,請查閱相關文件即可。

2、SELECT查詢必須指明欄位名稱

SELECT * 的查詢會加很多不必要的消耗(例如CPU、I/O等),同時,也有可能增加了使用覆蓋索引。所以SELECT查詢時,要求直接在後面指明需要查詢的對應欄位名。

3、查詢一筆資料的時候,使用LIMIT 1

減少多餘的查詢,因為指定limit 1後,查詢到一條資料就不再繼續查詢了,使得EXPLAIN中type列達到const類型,查詢語句更優。

4、為搜尋的WHERE欄位建立索引

一般,每個表我們都會設定一個主鍵,而索引不一定就是給主鍵。如果在你的表中,有某個字段你總要會經常用來做WHERE查詢搜索,而且是讀大於寫的,那麼,請為其建立索引吧,有興趣了解更多建立索引的的原則,可查閱相關資料。

5、千萬不要使用ORDER BY RAND()

如果你想隨機取數據,也許第一個直接會告訴你,用隨機數取,切記,這個時候你必須控制你的大腦在這個方向繼續想下去,趕緊停止這種可怕的想法。因為這種查詢,對資料庫的效能毫無益處(消耗CPU)。較好的方案之一是先找到資料所在的條數N,然後再用LIMIT N, 1這樣查詢。

6、保證每張表都有一個主鍵ID

我們應該養成一種習慣,每設計新建一張表的時候,都應該為其設計一個ID字段,並讓其成為主鍵,而且最好是INT型(也有使用UUID的),同時設定這個ID欄位為自增(AUTO_INCREMENT)的標誌。

8、盡可能的使用NOT NULL

不要以為NULL不需要空間,事實是NULL也需要額外的空間,也許,很多有沒注意但是遇到過,NULL欄位在進行查詢比較的時候,是比較麻煩的。當然了,如果你實在是必須需要NULL的話,那沒轍,就使用吧,否則的話,就建議使用NOT NULL吧。

8、選擇合適的儲存引擎

在MySQL中有MyISAM和InnoDB兩種儲存引擎,兩者各有利弊,所以我們需要了解兩者的差異然後來做最合適的選擇,例如InnoDB支援事務而MyISAM不支持,MyISAM查詢比InnoDB快等等;總之,如果你不知道選擇什麼的話,那就用InnoDB吧。

9、把IP位址存為UNSIGNED INT

在遇到需要儲存IP位址的時候,很多人的第一想法都會是儲存VARCHAR(15)字串類型的,而不會想到要用INT整型來存儲;如果你用整型來存儲,只需要4個字節,並且你可以有定長的字段,而且這會為你帶來查詢上的優勢。

10、盡量不要在WHERE查詢時對字段進行null值判斷

我們都知道,檔我們對一個字段進行null的判斷時候,會比較慢的,這是因為這個判斷會導致引擎放棄使用所有現有的索引而進行全表掃描搜尋。

11、盡量不要使用%前綴的LIKE模糊查詢

模糊查詢,在日常開發中,我們都會經常遇到,但是我相信很多人都是直接LIKE ' %key_word%'LIKE '%key_word' 這樣搜尋的,這兩種搜尋方式,都會導致索引失效從而進行全表掃描搜尋。如果解決上面的這種模糊查詢呢,答案就是使用“使用全文索引”,具體的用法有興趣的可以自己查資料一波。

12、避免在WHERE查詢時對欄位進行表達式操作

例如查詢語句SELECT id FROM table WHERE num * 2 = 50;,這樣的查詢,對字段num做了一個乘2的算數操作,就會導致索引失效。

14、減少不必要的排序

排序操作會消耗較多的CPU資源,所以減少不必要的排序可以在快取命中率高等I/O足夠的情況下,會降低SQL的響應時間。

14、建議用JOIN代替子查詢

有的人會說,JOIN的性能其實也並不是很好呀,但是和子查詢比起來還是有很大的性能優勢的。具體的,可以了解一下子查詢的執行計劃相關的問題。

15、避免發生隱式類型轉換

類型轉換主要是指在WHERE子句中出現欄位的類型和傳入的參數類型不一致的時候發生的型別轉換;這是指在WHERE子句中出現欄位的型別和傳入的參數型別不一致的時候發生的型別轉換;這是因為如果我們傳入的資料類型和欄位類型不一致,MySQL可能會對我們傳的資料進行類型轉換操作,也可能不進行處理而直接交由儲存引擎去處理,這樣一來,就可能會出現索引無法使用的情況而造成執行計劃問題。

16、避免多表查詢欄位類型不一致

在遇到需要多表聯合查詢的時候,我們設計表結構的時候,盡量保持表與表的關聯欄位一致,並且都要設定索引。同時,多表連接查詢時,盡量把結果集小的表當作驅動表。

17、建議開啟查詢快取

大多數的MySQL伺服器都開啟了查詢緩存,這是提高效能最有效的方法之一,因為查詢快取由MySQL資料庫引擎自動處理,當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個快取中,這樣,後續的相同的查詢就不用操作表,而直接存取快取結果了。

18、使用UNION取代暫存資料表

UNION查詢可以把兩個或更多的SELECT查詢結果合併到一個查詢中,所以不再需要建立暫存表來完成。需要注意的是,使用UNION的所有SELECT語句中的字段數目要相同。

19、慎用IN查詢

IN以及NOT IN查詢都要慎重,因為可能會導致全表掃描,而對於連續的數值,能用BETWEEN就不要用IN了。

20、歡迎補充

結束語

這主要是從查詢角度去考慮優化,還有一些分錶、分區技術以及讀寫分離等;以上優化之處,如果說的不到位的地方,請大家諒解,MySQL優化的地方可以有很多處,歡迎提出其他優化建議,謝謝。

以上是mysql的20個最佳化總結的詳細內容。更多資訊請關注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)

Java中Synchronized的原理與使用場景及Callable介面的使用方法及區別分析 Java中Synchronized的原理與使用場景及Callable介面的使用方法及區別分析 Apr 21, 2023 am 08:04 AM

一、基本特性1.一開始是樂觀鎖,如果鎖衝突頻繁,就轉換為悲觀鎖.2.開始是輕量級鎖實現,如果鎖被持有的時間較長,就轉換成重量級鎖. 3.實現輕量級鎖的時候大概率用到的自旋鎖策略4.是一種不公平鎖5.是一種可重入鎖6.不是讀寫鎖二、加鎖工作過程JVM將synchronized鎖分為無鎖、偏向鎖、輕量級鎖、重量級鎖狀態。會根據情況,進行依序升級。偏向鎖假設男主角是一個鎖,女主角是一個線程.如果只有這一個線程來使用這個鎖,那麼男主女主即使不領證結婚(避免了高成本操作),也可以一直幸福的生活下去.但是女配出現

Java關鍵字synchronized原理與鎖定的狀態實例分析 Java關鍵字synchronized原理與鎖定的狀態實例分析 May 11, 2023 pm 03:25 PM

一、Java中鎖的概念自旋鎖:是指當一個線程獲取鎖的時候,如果鎖已經被其它線程獲取,那麼該線程將循環等待,然後不斷的判斷鎖是否能被成功獲取,直到獲取到鎖才會退出循環。樂觀鎖:假定沒有衝突,在修改數據時如果發現數據和先前取得的不一致,則讀最新數據,重試修改。悲觀鎖:假定會發生並發衝突,同步所有對資料的相關操作,從讀取資料就開始上鎖。獨享鎖(寫):給資源加上寫鎖,執行緒可以修改資源,其它執行緒不能再加鎖(單一寫)。共享鎖(讀):給資源加上讀鎖後只能讀不能修改,其它執行緒也只能加讀鎖,不能加寫鎖(多度)。看成S

Java中如何利用synchronized實作同步機制? Java中如何利用synchronized實作同步機制? Apr 22, 2023 pm 02:46 PM

Java的synchronized使用方法總結1.把synchronized當作函數修飾符時,範例程式碼如下:Publicsynchronizedvoidmethod(){//….}這也就是同步方法,那這時synchronized鎖定的是哪個物件呢?他鎖定的是呼叫這個同步方法物件。也就是說,當一個物件P1在不同的執行緒中執行這個同步方法時,他們之間會形成互斥,達到同步的效果。但是這個物件所屬的Class所產生的另一物件P2卻能夠任意呼叫這個被加了synchronized關鍵字的方法。上邊的範例程式碼等

Java中的三種同步方式和它們的使用方法是什麼? Java中的三種同步方式和它們的使用方法是什麼? Apr 27, 2023 am 09:34 AM

1.說明synchronized算是我們最常用的同步方式,主要有三種使用方式。 2.實例//普通類別方法同步synchronizedpublidvoidinvoke(){}//類別靜態方法同步synchronizedpublicstaticvoidinvoke(){}//程式碼區塊同步synchronized(object){}這三種方式的不同之處在於同步的物件不同,普通類別synchronized同步的是物件本身,靜態方法同步的是類別Class本身,程式碼區塊同步的是我們在括號內部填入的物件。 Java有哪些集合

Java Synchronized鎖定升級原理及流程是什麼 Java Synchronized鎖定升級原理及流程是什麼 Apr 19, 2023 pm 10:22 PM

工具準備在正式談synchronized的原理之前我們先談一下自旋鎖,因為在synchronized的優化當中自旋鎖發揮了很大的作用。而需要了解自旋鎖,我們首先要了解什麼是原子性。所謂原子性簡單說來就是一個一個操作要么不做要么全做,全做的意思就是在操作的過程當中不能夠被中斷,比如說對變量data進行加一操作,有以下三個步驟:將data從記憶體載入到暫存器。將data這個值加一。將得到的結果寫回記憶體。原子性就表示一個執行緒在進行加一操作的時候,不能夠被其他執行緒中斷,只有這個執行緒執行完這三個過程的時候

Java中為什麼需要提供Lock,而不只使用synchronized關鍵字? Java中為什麼需要提供Lock,而不只使用synchronized關鍵字? Apr 20, 2023 pm 05:01 PM

摘要:在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠存取同步程式碼區塊。既然已經提供了synchronized關鍵字,為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下這個問題。在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠存取同步程式碼區塊。既然已經提供了synchronized關鍵字,為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下

Java Synchronized是什麼 Java Synchronized是什麼 May 14, 2023 am 08:28 AM

Synchronized是什麼各位Java讀者,對於synchronized關鍵字並不陌生,在各種中間件源碼或JDK源碼中都能看到,對於不熟悉synchronized的讀者只知道在多線程中需要使用到synchronized關鍵字,知道synchronized能夠保證線程安全。稱之為:互斥鎖(同時只能一個執行緒執行,其他的執行緒將會等待)又稱之為:悲觀鎖(同時只能一個執行緒執行,其他的執行緒將會等待)JVM虛擬機幫你實現,開發者只需要使用synchronized關鍵字即可。使用時需要用一個物件當鎖的互斥

Java中有多少個非存取修飾符? Java中有多少個非存取修飾符? Aug 30, 2023 pm 06:01 PM

Java提供了一些其他修飾符來提供除可見性之外的功能。這些修飾符稱為非存取修飾符靜態宣告為靜態的成員對於類別的所有實例都是通用的。靜態成員是儲存在類別記憶體中的類別層級成員。 Final此修飾符用於限制變數、方法或類別的進一步修改。宣告為final的變數的值一旦獲得值就不能修改。 Final方法不能在子類別中重寫,也不能建立Final類別的子類別。抽象此修飾符可以與類別或方法一起使用。您不能將此修飾符應用於變數和建構函式。聲明為抽象的方法必須在子類別中進行修改。您無法實例化聲明為抽象的類別。同步此修飾符用於控制多個執行緒

See all articles