小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MySQL查詢優(yōu)化

 pengx 2009-04-26

  在實(shí)際工作中,無論是對數(shù)據(jù)庫系統(tǒng)(DBMS),還是對數(shù)據(jù)庫應(yīng)用系統(tǒng)(DBAS),查詢優(yōu)化一直是一個(gè)熱門話題。一個(gè)成功的數(shù)據(jù)庫應(yīng)用系統(tǒng)的開發(fā),肯定會在查詢優(yōu)化上付出很多心血。對查詢優(yōu)化的處理,不僅會影響到數(shù)據(jù)庫工作效率,而且會給公司帶來實(shí)實(shí)在在的效益問題。MySQL是一個(gè)開源軟件,但它的性能絲毫不遜于商業(yè)數(shù)據(jù)庫,它的速度已經(jīng)相當(dāng)快。但要想做好查詢優(yōu)化,還要考慮一些技巧上的東西。下面是我學(xué)習(xí)和使用MySQL以來的一些對優(yōu)化查詢的感受。

  首先,我們應(yīng)該考慮哪些因素能影響到查詢優(yōu)化?可以分為:機(jī)器硬件、索引、系統(tǒng)參數(shù)、查詢技巧等。對于一個(gè)查詢優(yōu)化問題,我們應(yīng)該首先考慮哪各方面呢?索引的使用應(yīng)該再考慮的首條,毋庸置疑的是,在沒有使用索引的前提下,想用其它招數(shù)來大幅度改善性能的做法往往收獲甚微,純粹是在浪費(fèi)時(shí)間,可事實(shí)無絕對,有些場合反而需要去抑制優(yōu)化程序的行為。

  我們先來說說索引。索引能提高查詢效率的原因之一是它可以讓我們知道最后一個(gè)符合條件的數(shù)據(jù)行出現(xiàn)在什么位置,此后的數(shù)據(jù)行都用不著在檢查了,另一個(gè)原因是人們已經(jīng)發(fā)明了很多中定位算法來迅速查出第一個(gè)符合條件的數(shù)據(jù)行出現(xiàn)在什么位置,用不著從索引的開頭通過線性掃描法去定位一個(gè)匹配項(xiàng)。

  MySQL在建立索引時(shí),對不同的數(shù)據(jù)表有不同的細(xì)節(jié):MyISAM數(shù)據(jù)表,數(shù)據(jù)行將被保存在數(shù)據(jù)文件里,其索引值將被保存在索引文件里,而BDB處理程序把同一個(gè)BDB數(shù)據(jù)表的數(shù)據(jù)值和索引值保存在同一個(gè)文件里,InnoDB處理程序則是把所有InnoDB數(shù)據(jù)表的數(shù)據(jù)值和索引值都保存在同一個(gè)表空間里。這些看似與建立索引無關(guān),其實(shí)是很重要的,待會我后說道。還有,索引不僅能給單據(jù)表帶來好處,然而,索引給涉及多個(gè)數(shù)據(jù)表的關(guān)聯(lián)查詢帶來的好處就更打了。

  建立索引也要考慮它的缺點(diǎn)。首先,索引需要消耗磁盤空間(現(xiàn)在磁盤已經(jīng)很便宜了),索引越多,消耗的空間也就有多。對于MyISAM數(shù)據(jù)表,過多的索引會使索引文件優(yōu)先與數(shù)據(jù)文件達(dá)到尺寸上限。對于BDB數(shù)據(jù)表,因?yàn)樗褦?shù)據(jù)值和索引值都保存在同一個(gè)文件里,所以增加索引必然會使他更快地達(dá)到BDB數(shù)據(jù)文件的尺寸上限。InnoDB數(shù)據(jù)表共同分享著InnoDB表空間里的存儲空間,所以增加索引必然會加快InnoDB表空間的消耗速度。不過,只要還能增加磁盤空間,就能通過給InnoDB表空間增加組件的辦法擴(kuò)充之。

  其次,索引過多,會減慢被索引的數(shù)據(jù)列上的插入、刪除和修改操作的速度。因?yàn)樵趯懭胗涗洉r(shí),MySQL還必須修改與之有關(guān)的所有索引。

  下面我們考慮應(yīng)該選擇什么樣的數(shù)據(jù)列來創(chuàng)建索引?怎樣才能創(chuàng)建出最使用的索引?怎樣處理數(shù)據(jù)類型給索引帶來的影響?原則是:

  1、 引應(yīng)該創(chuàng)建在搜索、排序、歸組等操作所涉及的數(shù)據(jù)列上,只在輸出報(bào)告里出現(xiàn)的數(shù)據(jù)列不是好的候選。

  2、 盡量使用唯一化索引。因?yàn)槿绻麛?shù)據(jù)列里有很多彼此重復(fù)的值,建立在其上的索引就不會有好的效果。

  3、 盡量對比較短的值進(jìn)行索引。

  4、 對于復(fù)合索引,MySQL會先匹配它的第一個(gè)索引列,如果匹配不上它就不會使用這個(gè)索引了。

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

  6、 考慮將在這個(gè)數(shù)據(jù)列上進(jìn)行怎樣的比較操作。對于HEAP數(shù)據(jù)表來說,它只會用“=”來比較,其他比較操作就幫不上忙了。

  7、 利用慢查詢?nèi)罩緛碚页瞿切┬阅艿土拥牟樵?。不過不要認(rèn)為這是絕對的,因?yàn)镸ySQL會將凡是沒使用索引的查詢一并寫入這個(gè)日志里,要有選擇的查看這個(gè)日志哦。

  8、 要盡量把數(shù)據(jù)列聲明為NOT NULL,這樣可以排除在對空值的查詢,在有些時(shí)候,能起到很大的作用。

  9、 對于字符串?dāng)?shù)據(jù)列,如果其取值是有限的,應(yīng)優(yōu)先考慮使用ENUM類型,因?yàn)镸ySQL是用處理數(shù)值型的方法來處理這種字符串的,速度比處理字符串要快得多。

  10、 對于那些聲明為可變長度的數(shù)據(jù)列(如varchar型),時(shí)間長了會使得數(shù)據(jù)表出現(xiàn)很多碎片,減慢查詢效率,我們可以用OPTIMIZE TABLE語句對之進(jìn)行整理。

  11、 將數(shù)據(jù)壓縮到BLOB數(shù)據(jù)列里,就能只通過一次性查詢找到數(shù)據(jù),或者把BLOB數(shù)據(jù)列單獨(dú)存入一個(gè)文件。

  12、 有時(shí)我們可以人為的為一個(gè)數(shù)據(jù)表建立索引,然后查詢這個(gè)索引達(dá)到快速查詢的目的。例如:我們先給一個(gè)數(shù)據(jù)表再建一個(gè)數(shù)據(jù)列,根據(jù)數(shù)據(jù)表里其他數(shù)據(jù)列計(jì)算出一個(gè)散列值并保存到剛建的數(shù)據(jù)列里,這樣就可以通過搜索散列值的方法去檢索想要找到數(shù)據(jù)行。

  MySQL查詢優(yōu)化程序是盡可能的使用索引,而且是盡可能地使用那些最為挑剔的索引,以便盡可能多和盡可能快的排除那些不符合查詢條件的數(shù)據(jù)行??梢砸勒找韵略瓌t幫助優(yōu)化程序:

  1. 盡量對同類型的數(shù)據(jù)列進(jìn)行比較,必要時(shí)可以先用ALTER TABLE語句把其中之一的類型修改為與另一個(gè)數(shù)據(jù)列相同。

  2. 盡量讓已經(jīng)索引的數(shù)據(jù)列在比較表達(dá)式中單獨(dú)出現(xiàn)。

  3. 盡量減輕模糊匹配查詢,例如:不要在LIKE模式的開頭使用通配符等。

  4. 多試幾種查詢命令。

  5. 不要濫用MySQL的類型自動轉(zhuǎn)換功能,如:數(shù)字3就不能寫成字符‘3’,加重MySQL的類型轉(zhuǎn)換,會使它的性能下降。

  下面說說加載數(shù)據(jù)。

  加載數(shù)據(jù)時(shí)要采用批量加載,盡量減少M(fèi)ySQL對索引的刷新率,例如:LOAD DATA 語句要比INSERT 語句效率高,如果必須使用INSERT 語句,請盡量使他們集中在一起,減少對索引的刷新次數(shù)。對于支持事務(wù)處理機(jī)制的數(shù)據(jù)表類型,應(yīng)該把這些INSERT 語句放在同一個(gè)事務(wù)里,對于不支持事務(wù)處理機(jī)制的數(shù)據(jù)表類型,應(yīng)該現(xiàn)對數(shù)據(jù)表進(jìn)行寫鎖定,然后在數(shù)據(jù)表鎖定期間發(fā)出這些INSERT語句。對于大量數(shù)據(jù),可以先加載數(shù)據(jù)在建立索引。

  在機(jī)器硬件方面:

  1. 應(yīng)為機(jī)器安裝更多內(nèi)存。

  2. 購置高速磁盤以縮短I/O等待時(shí)間。

  3. 使用多個(gè)物理硬盤,提高并行操作能力。

  4. 使用多個(gè)處理器。

  在一個(gè)具體的數(shù)據(jù)庫應(yīng)用系統(tǒng)中,要根據(jù)實(shí)際需要來采用各種優(yōu)化策略,以便使顧客與公司達(dá)到雙贏的目的。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多