程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> mysql 查詢優化

mysql 查詢優化

編輯:關於MYSQL數據庫

在實際工作中,無論是對數據庫系統(DBMS),還是對數據庫應用系統(DBAS),數據查詢優化是熱門話題。成功的數據庫應用系統的開發,在查詢優化上必須付出很多心血。對查詢優化的處理,不僅僅影響到數據庫也程序的工作效率,也會給公司帶來效益問題。MySQL是一個開源軟件,但它的性能毫不遜於商業數據庫,它的速度已經相當快。但想要做好查詢優化,必須的考慮一些技巧上的東西。

首先,哪些因素影響到查詢問題?可以分為:機器硬件、索引、系統參數、查詢技巧等。對於一個查詢優化問題,我們應該首先考慮哪各方面呢?索引的使用應該再考慮的首條,毫無疑問的是,如果沒有使用索引,直接使用其它招數來大幅度改善性能的做法往往收獲甚微,純粹是在浪費時間,可事實無絕對,而有些需要優化程序。

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

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. 使用多個處理器。

在一個具體的數據庫應用系統中,要根據實際需要來采用各種優化策略

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved