MySQL優化 查詢優化

2021-08-21 22:39:29 字數 3291 閱讀 5460

在每乙個消耗大量時間的查詢中,都能看到一些不必要的額外操作、某些操作被額外地重複了很多次、某些操作執行得太慢等。優化查詢的目的就是減少和消除這些操作所花費的時間。

查詢效能低下最基本的原因是訪問的資料太多。所以需要考慮是否向資料庫請求了不需要的資料

1、多表關聯時,或獲取單錶資料時,盡量避免不加思考地使用select *

從資料庫裡讀出的資料越多,查詢就會越慢。每次查詢考慮好需要取出的列,需要什麼取出什麼

2、當需要一條資料時,記得limit1

例如在處理分頁時,應該使用limit限制mysql只返回需要的資料,而不是向應用程式返回全部資料後,再由應用程式過濾不需要的行。

3、使用快取,減少查詢請求

當一些資料被多次使用時可以考慮將資料快取起來,避免每次使用都要到mysql查詢。例如可以使用redis、memcache等

4、為搜尋字段新增索引

索引不一定就是給主鍵或者是唯一的字段,如果在表中,有某個字段經常用來做搜尋,需要將其建立索引。

詳細有關索引學習可以檢視  

5、不要使用order by rand()

mysql去執行rand()函式(很耗cpu時間),而且這是為了每一行記錄去記行,然後再對其排序。就算是你用了limit 1也無濟於事(因為要排序) 。如果你真的想把返回的資料行打亂了,你有多種其他方法可以達到這個目的。這樣使用只讓你的資料庫的效能呈指數級的下降。

6、為每張表設定乙個id主鍵

我們應該為資料庫裡的每張表都設定乙個id做為其主鍵,而且最好的是乙個int型的,並設定上自動增加的 auto_increment標誌。

7、盡量為字段固定長度

例如varchar、text等字段型別。雖然不固定長度可以節約空間,但是每一次查詢更耗費時間。固定長度的表會提高效能,因為mysql搜尋得會更快一些,因為這些固定的長度是很容易計算下乙個資料的偏移量的,所以讀取的自然也會很快。而如果字段不是定長的,那麼,每一次要找下一條的話,需要程式找到主鍵。 並且,固定長度的表也更容易被快取和重建。

8、選擇正確的儲存引擎

mysql中有不同的儲存引擎,其中有myisam  和 innodb 。每個引擎都要他的利弊。

myisam管理非事務表。它提供高速儲存和檢索,以及全文搜尋能力。如果應用中需要執行大量的select查詢,那麼myisam是更好的選擇。

innodb用於事務處理應用程式,具有眾多特性,包括acid事務支援。如果應用中需要執行大量的insert或update操作,則應該使用innodb,這樣可以提高多使用者併發操作的效能。

9、使用explain關鍵字檢測查詢

使用explain關鍵字可以使我們知道mysql是如何處理sql語句的,這樣可以幫助我們分析我們的查詢語句或是表結構的效能瓶頸。

10、盡量避免sql中出現運算

例如select a+5 from a,讓db功能單一化

11、設計表的時候盡量用」小資料型別」,比如盡量避免text,blob等這些大傢伙,優先使用enum和set

12、設計表字段能用數字型別就千萬別用字元型別,比如存ip位址,用int,別用varchar

13、盡量避免null欄位

定義時盡量使用 not null.原因是允許null時不方便查詢優化,復合索引也會失效,而且如果列有索引時會額外占用空間

14、避免 「% 字首」 或者 「%內容%」 模糊查詢

因為會導致索引失效,大資料量下是災難

15、在做分頁查詢時,避免 limit 1000000,100

這種分頁查詢方式會從資料庫第一條記錄開始掃瞄,所以越往後,查詢速度越慢,而且查詢的資料越多,也會拖慢總查詢速度。可以使用子查詢優化id限定優化(參考w3cschool)

使用子查詢優化

這種方式先定位偏移位置的 id,然後往後查詢,這種方式適用於 id 遞增的情況。

select * from orders_history where type=8 limit 100000,1;

select id from orders_history where type=8 limit 100000,1;

select * from orders_history where type=8 and

id>=(select id from orders_history where type=8 limit 100000,1)

limit 100;

select * from orders_history where type=8 limit 100000,100;

4條語句的查詢時間如下:

第1條語句:3674ms     第2條語句:1315ms     第3條語句:1327ms     第4條語句:3710ms

針對上面的查詢需要注意:

1、比較第1條語句和第2條語句:使用 select id 代替 select * 速度增加了3倍

2、比較第2條語句和第3條語句:速度相差幾十毫秒

3、比較第3條語句和第4條語句:得益於 select id 速度增加,第3條語句查詢速度增加了3倍

這種方式相較於原始一般的查詢方法,將會增快數倍。

使用 id 限定優化

這種方式假設資料表的id是連續遞增的,則我們根據查詢的頁數和查詢的記錄數可以算出查詢的id的範圍,可以使用 id between and 來查詢:

select * from orders_history where type=2 

and id between 1000000 and 1000100 limit 100;

這種查詢方式能夠極大地優化查詢速度,基本能夠在幾十毫秒之內完成。限制是只能使用於明確知道id的情況,不過一般建立表的時候,都會新增基本的id欄位,這為分頁查詢帶來很多遍歷。

還可以有另外一種寫法:

select * from orders_history where id >= 1000001 limit 100;
詳細關於分頁查詢優化可以參考  

若有錯誤和建議,歡迎提出

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...

mysql統計查詢優化 Mysql查詢優化

效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...

mysql查詢優化

1 不要在like模式的開始位置使用萬用字元。不要出於習慣而將符號 放在字串的兩側。如果只想找到出現在資料列開始位置的字串,就需要乙個 假定你想找mac開始包含的名字。如macgre和macdel.就需要這樣 where last name like mac 優化程式看到後,會使用索引找到匹配的資料...