MySQL查詢優化

2021-06-22 22:23:59 字數 2459 閱讀 6308

首先,我們應該考慮哪些因素能影響到查詢優化?可以分為:機器硬體、索引、系統引數、查詢技巧等。對於乙個查詢優化問題,我們應該首先考慮哪各方面呢? 索引的使用應該再考慮的首條,毋庸置疑的是,在沒有使用索引的前提下,想用其它招數來大幅度改善效能的做法往往收穫甚微,純粹是在浪費時間,可事實無絕 對,有些場合反而需要去抑制優化程式的行為。

我們先來說說索引。索引能提高查詢效率的原因之一是它可以讓我們知道最後乙個符合條件的數 據行出現在什麼位置,此後的資料行都用不著在檢查了,另乙個原因是人們已經發明了很多中定位演算法來迅速查出第乙個符合條件的資料行出現在什麼位置,用不著 從索引的開頭通過線性掃瞄法去定位乙個匹配項。

mysql在建立索引時,對不同的資料表有不同的細節:myisam資料表,資料行將被 儲存在資料檔案裡,其索引值將被儲存在索引檔案裡,而bdb處理程式把同乙個bdb資料表的資料值和索引值儲存在同乙個檔案裡,innodb處理程式則是 把所有innodb資料表的資料值和索引值都儲存在同乙個表空間裡。這些看似與建立索引無關,其實是很重要的,待會我後說道。還有,索引不僅能給單據錶帶 來好處,然而,索引給涉及多個資料表的關聯查詢帶來的好處就更打了。

建立索引也要考慮它的缺點。首先,索引需要消耗磁碟空間(現在磁碟 已經很便宜了),索引越多,消耗的空間也就有多。對於myisam資料表,過多的索引會使索引檔案優先與資料檔案達到尺寸上限。對於bdb資料表,因為它 把資料值和索引值都儲存在同乙個檔案裡,所以增加索引必然會使他更快地達到bdb資料檔案的尺寸上限。innodb資料表共同分享著innodb表空間裡 的儲存空間,所以增加索引必然會加快innodb表空間的消耗速度。不過,只要還能增加磁碟空間,就能通過給innodb表空間增加元件的辦法擴充之。

其次,索引過多,會減慢被索引的資料列上的插入、刪除和修改操作的速度。因為在寫入記錄時,mysql還必須修改與之有關的所有索引。

下面我們考慮應該選擇什麼樣的資料列來建立索引?怎樣才能建立出最使用的索引?怎樣處理資料型別給索引帶來的影響?原則是:

1、 引應該建立在搜尋、排序、歸組等操作所涉及的資料列上,只在輸出報告裡出現的資料列不是好的候選。

2、 盡量使用唯一化索引。因為如果資料列裡有很多彼此重複的值,建立在其上的索引就不會有好的效果。

3、 盡量對比較短的值進行索引。

4、 對於復合索引,mysql會先匹配它的第乙個索引列,如果匹配不上它就不會使用這個索引了。

5、 不要建立過多的索引。

6、 考慮將在這個資料列上進行怎樣的比較操作。對於heap資料表來說,它只會用「=」來比較,其他比較操作就幫不上忙了。

7、 利用慢查詢日誌來找出那些效能低劣的查詢。不過不要認為這是絕對的,因為mysql會將凡是沒使用索引的查詢一併寫入這個日誌裡,要有選擇的檢視這個日誌哦。

8、 要盡量把資料列宣告為not null,這樣可以排除在對空值的查詢,在有些時候,能起到很大的作用。

9、 對於字串資料列,如果其取值是有限的,應優先考慮使用enum型別,因為mysql是用處理數值型的方法來處理這種字串的,速度比處理字串要快得多。

10、 對於那些宣告為可變長度的資料列(如varchar型),時間長了會使得資料表出現很多碎片,減慢查詢效率,我們可以用optimize table語句對之進行整理。

11、 將資料壓縮到blob資料列裡,就能只通過一次性查詢找到資料,或者把blob資料列單獨存入乙個檔案。

12、 有時我們可以人為的為乙個資料表建立索引,然後查詢這個索引達到快速查詢的目的。例如:我們先給乙個資料表再建乙個資料列,根據資料表裡其他資料列計算出乙個雜湊值並儲存到剛建的資料列裡,這樣就可以通過搜尋雜湊值的方法去檢索想要找到資料行。

mysql查詢優化程式是盡可能的使用索引,而且是盡可能地使用那些最為挑剔的索引,以便盡可能多和盡可能快的排除那些不符合查詢條件的資料行。可以依照以下原則幫助優化程式:

1. 盡量對同型別的資料列進行比較,必要時可以先用alter table語句把其中之一的型別修改為與另乙個資料列相同。

2. 盡量讓已經索引的資料列在比較表示式中單獨出現。

3. 盡量減輕模糊匹配查詢,例如:不要在like模式的開頭使用萬用字元等。

4. 多試幾種查詢命令。

5. 不要濫用mysql的型別自動轉換功能,如:數字3就不能寫成字元『3』,加重mysql的型別轉換,會使它的效能下降。

下面說說載入資料。

載入資料時要採用批量載入,儘量減少mysql對索引的重新整理率,例如:load data 語句要比insert 語句效率高,如果必須使用insert 語句,請盡量使他們集中在一起,減少對索引的重新整理次數。對於支援事務處理機制的資料表型別,應該把這些insert 語句放在同乙個事務裡,對於不支援事務處理機制的資料表型別,應該現對資料表進行寫鎖定,然後在資料表鎖定期間發出這些insert語句。對於大量資料, 可以先載入資料在建立索引。

在機器硬體方面:

1. 應為機器安裝更多記憶體。

2. 購置高速磁碟以縮短i/o等待時間。

3. 使用多個物理硬碟,提高並行操作能力。

4. 使用多個處理器。

在乙個具體的資料庫應用系統中,要根據實際需要來採用各種優化策略,以便使顧客與公司達到雙贏的目的。

查詢優化(MySQL優化查詢)

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

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

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

MySQL優化 查詢優化

在每乙個消耗大量時間的查詢中,都能看到一些不必要的額外操作 某些操作被額外地重複了很多次 某些操作執行得太慢等。優化查詢的目的就是減少和消除這些操作所花費的時間。查詢效能低下最基本的原因是訪問的資料太多。所以需要考慮是否向資料庫請求了不需要的資料 1 多表關聯時,或獲取單錶資料時,盡量避免不加思考地...