欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從MySQL得到最大的優(yōu)化性能

 更新時間:2006年11月21日 00:00:00   作者:  
優(yōu)化是一項復(fù)雜的任務(wù),因為它最終需要對整個系統(tǒng)的理解.當(dāng)用你的系統(tǒng)/應(yīng)用的小知識做一些局部優(yōu)化是可能的時候,你越想讓你的系統(tǒng)更優(yōu)化,你必須知道它也越多. 因此,本章將試圖解釋并給出優(yōu)化MySQL的不同方法的一些例子.但是記住總是有某些(逐漸變難)是系統(tǒng)更快的方法留著去做. 為了使一個系統(tǒng)更快的最重要部分當(dāng)然是基本設(shè)計.你也需要知道你的系統(tǒng)將做這樣的事情,那就是你的瓶頸. 最常見的瓶頸是: 


磁盤尋道.磁盤花時間找到一個數(shù)據(jù),用在1999年的現(xiàn)代磁盤其平均時間通常小于10ms,因此理論上我們能大約一秒尋道 1000 次.這個時間用新磁盤提高很慢并且很難對一個表優(yōu)化.優(yōu)化它的方法是將數(shù)據(jù)散布在多個磁盤上. 當(dāng)磁盤在我們需要讀數(shù)據(jù)的正確位置時,磁盤讀/寫.用1999年的現(xiàn)代,一個磁盤傳輸類似10-20Mb/s.這必尋道更容易優(yōu)化,因為你能從多個磁盤并行地讀. CPU周期.當(dāng)我們讀數(shù)據(jù)進(jìn)內(nèi)存時,(或如果它已經(jīng)在那里)我們需要處理它以達(dá)到我們的結(jié)果.當(dāng)我們有相對內(nèi)存較小的表時,這是最常見的限制因素,但是用小表速度通常不是問題. 內(nèi)存帶寬.當(dāng)CPU需要超出適合cpu緩存的數(shù)據(jù)時,緩存帶寬就成為內(nèi)存的一個瓶頸.這是對大多數(shù)系統(tǒng)的一個不常見的瓶頸但是你應(yīng)該知道它. 10.2 系統(tǒng)/編譯時和啟動參數(shù)的調(diào)節(jié)我們以系統(tǒng)級的東西開始,因為這些決策的某一些很早就做好了.在其他情況下,快速瀏覽這部分可能就夠了,因為它對大收獲并不重要,但是有一個關(guān)于在這個層次上收獲有多大的感覺總是好的. 使用的缺省OS確實(shí)重要!為了最大程度地使用多CPU,應(yīng)該使用Solaris(因為線程工作得確實(shí)不錯)或Linux(因為2.2本的核心又確實(shí)不錯的SMP支持).而且在32位的機(jī)器上,Linux缺省有2G的文件大小限制.當(dāng)新的文件系統(tǒng)被釋出時( XFS ),希望這不久被修正. 因為我們沒在很多平臺上運(yùn)行生產(chǎn)MySQL,我們忠告你在可能選擇它前,測試你打算運(yùn)行的平臺. 


其他建議: 


如果你有足夠的RAM,你能刪除所有交換設(shè)備.一些操作系統(tǒng)在某些情況下將使用一個SWAP設(shè)備,即使你有空閑的內(nèi)存. 使用--skip -locking的MySQL選項避免外部鎖定.注意這將不影響MySQL功能,只要它僅運(yùn)行在一個服務(wù)器上.只要在你運(yùn)行myisamchk以前,記得要停掉服務(wù)器(或鎖定相關(guān)部分).在一些系統(tǒng)上這個開關(guān)是強(qiáng)制的,因為外部鎖定不是在任何情況下都工作.當(dāng)用MIT-pthreads編譯時,-- skip-locking選項缺省為打開(on),因為flock()沒在所有的平臺上被MIT-pthreads充分支持.唯一的情況是如果你對同一數(shù)據(jù)運(yùn)行MySQL服務(wù)器(不是客戶),你不能使用--skip-locking之時,否則對沒有先清掉(flushing)或先鎖定mysqld服務(wù)器的表上運(yùn)行myisamchk.你仍然能使用LOCK TABLES/ UNLOCK TABLES,即使你正在使用--skip-locking. 


編譯和鏈接怎樣影響MySQL的速度 


大多數(shù)下列測試在Linux上并用MySQL基準(zhǔn)進(jìn)行的,但是它們應(yīng)該對其他操作系統(tǒng)和工作負(fù)載給出一些指示. 當(dāng)你用-static鏈接時,你得到最快的可執(zhí)行文件.使用Unix套接字而非TCP/IP連接一個數(shù)據(jù)庫也可給出好一些的性能. 在Linux上,當(dāng)用pgcc和-O6編譯時,你將得到最快的代碼.為了用這些選項編譯“sql_yacc.cc”,你需要大約200M內(nèi)存,因為 gcc/pgcc需要很多內(nèi)存使所有函數(shù)嵌入(inline).在配置MySQL時,你也應(yīng)該設(shè)定CXX=gcc以避免包括libstdc++庫(它不需要). 只通過使用一個較好的編譯器或較好的編譯器選項,在應(yīng)用中你能得到一個10-30%的加速.如果你自己編譯SQL服務(wù)器,這特別重要! 在Intel上,你應(yīng)該例如使用pgcc或Cygnus CodeFusion編譯器得到最大速度.我們已經(jīng)測試了新的 Fujitsu編譯器,但是它是還沒足夠不出錯來優(yōu)化編譯MySQL. 

 

這里是我們做過的一些測量表: 


如果你以-O6使用pgcc并且編譯任何東西,mysqld服務(wù)器是比用gcc快11%(用字符串99的版本). 如果你動態(tài)地鏈接(沒有-static),結(jié)果慢了13%.注意你仍能使用一個動態(tài)連接的MySQL庫.只有服務(wù)器對性能是關(guān)鍵的. 如果你使用TCP/IP而非Unix套接字,結(jié)果慢7.5%. 在一個Sun SPARCstation 10上,gcc2.7.3是比Sun Pro C++ 4.2快13%. 在Solaris 2.5.1上,在單個處理器上MIT-pthreads比帶原生線程的Solaris慢8-12%.以更多的負(fù)載/cpus,差別應(yīng)該變得更大. 由TcX提供的MySQL-Linux的分發(fā)用pgcc編譯并靜態(tài)鏈接. 


正如前面所述,磁盤尋道是一個性能的大瓶頸.當(dāng)數(shù)據(jù)開始增長以致緩存變得不可能時,這個問題變得越來越明顯.對大數(shù)據(jù)庫,在那你或多或少地要隨機(jī)存取數(shù)據(jù),你可以依靠你將至少需要一次磁盤尋道來讀取并且?guī)状未疟P尋道寫入.為了使這個問題最小化,使用有低尋道時間的磁盤. 為了增加可用磁盤軸的數(shù)量(并且從而減少尋道開銷),符號聯(lián)接文件到不同磁盤或分割磁盤是可能的. 使用符號連接這意味著你將索引/數(shù)據(jù)文件符號從正常的數(shù)據(jù)目錄鏈接到其他磁盤(那也可以被分割的).這使得尋道和讀取時間更好(如果磁盤不用于其他事情).見10.2.2.1 使用數(shù)據(jù)庫和表的符號鏈接. 分割分割意味著你有許多磁盤并把第一塊放在第一個磁盤上,在第二塊放在第二個磁盤上,并且第 n塊在第(n mod number_of_disks)磁盤上,等等.這意味著,如果你的正常數(shù)據(jù)大小于分割大小(或完美地排列過),你將得到較好一些的性能.注意,分割是否很依賴于OS和分割大小.因此用不同的分割大小測試你的應(yīng)用程序.見10.8 使用你自己的基準(zhǔn).注意對分割的速度差異很依賴于參數(shù),取決于你如何分割參數(shù)和磁盤數(shù)量,你可以得出以數(shù)量級的不同.注意你必須選擇為隨機(jī)或順序存取優(yōu)化. 為了可靠,你可能想要使用襲擊RAID 0+1(分割+鏡像),但是在這種情況下,你將需要2*N個驅(qū)動器來保存N個驅(qū)動器的數(shù)據(jù).如果你有錢,這可能是最好的選擇!然而你也可能必須投資一些卷管理軟件投資以高效地處理它. 一個好選擇是讓稍重要的數(shù)據(jù)(它能再生)上存在RAID 0磁盤上,而將確實(shí)重要的數(shù)據(jù)(像主機(jī)信息和日志文件)存在一個RAID 0+1或RAID N磁盤上.如果因為更新奇偶位你有許多寫入,RAID N可能是一個問題. 你也可以對數(shù)據(jù)庫使用的文件系統(tǒng)設(shè)置參數(shù).一個容易的改變是以noatime選項掛裝文件系統(tǒng).這是它跳過更新在inode中的最后訪問時間,而且這將避免一些磁盤尋道. 


你可以從數(shù)據(jù)庫目錄移動表和數(shù)據(jù)庫到別處,并且用鏈接到新地點(diǎn)的符號代替它們.你可能想要這樣做,例如,轉(zhuǎn)移一個數(shù)據(jù)庫到有更多空閑空間的一個文件系統(tǒng). 如果MySQL注意到一個表是一個符號鏈接,它將解析符號鏈接并且使用其實(shí)際指向的表,它可工作在支持realpath()調(diào)用的所有系統(tǒng)上(至少 Linux和Solaris支持realpath())!在不支持realpath()的系統(tǒng)上,你應(yīng)該不同時通過真實(shí)路徑和符號鏈接訪問表!如果你這樣做,表在任何更新后將不一致. MySQL缺省不支持?jǐn)?shù)據(jù)庫鏈接.只要你不在數(shù)據(jù)庫之間做一個符號鏈接,一切將工作正常.假定你在MySQL數(shù)據(jù)目錄下有一個數(shù)據(jù)庫db1,并且做了一個符號鏈接db2指向db1: 


shell&> cd /path/to/datadir 

shell&> ln -s db1 db2 

現(xiàn)在,對在db1中的任一表tbl_a,在db2種也好象有一個表tbl_a.如果一個線程更新db1.tbl_a并且另一個線程更新db2.tbl_a,將有問題. 如果你確實(shí)需要這樣,你必須改變下列在“mysys/mf_format.c”中的代碼: 


if (!lstat(to,&stat_buff)) /* Check if it's a symbolic link */ 

if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff)) 


把代碼改變?yōu)檫@樣: 


if (realpath(to,buff)) 

相關(guān)文章

  • mysql獲取group by的總記錄行數(shù)另類方法

    mysql獲取group by的總記錄行數(shù)另類方法

    mysql獲取group by內(nèi)部可以獲取到某字段的記錄分組統(tǒng)計總數(shù),而無法統(tǒng)計出分組的記錄數(shù),下面有個可行的方法,大家可以看看
    2014-10-10
  • MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)

    MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)

    這篇文章主要給大家介紹了關(guān)于MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用MySQL8.0具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • MySQL 數(shù)據(jù)庫定時備份的幾種方式(全面)

    MySQL 數(shù)據(jù)庫定時備份的幾種方式(全面)

    在操作數(shù)據(jù)過程中,可能會導(dǎo)致數(shù)據(jù)錯誤,甚至數(shù)據(jù)庫奔潰,而有效的定時備份能很好地保護(hù)數(shù)據(jù)庫。本篇文章主要講述了幾種方法進(jìn)行 MySQL 定時備份數(shù)據(jù)庫。
    2021-09-09
  • Mysql IO 內(nèi)存方面的優(yōu)化

    Mysql IO 內(nèi)存方面的優(yōu)化

    這篇文章主要介紹了Mysql IO 內(nèi)存方面的優(yōu)化 的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • mysql 聯(lián)合索引生效的條件及索引失效的條件

    mysql 聯(lián)合索引生效的條件及索引失效的條件

    兩個或更多個列上的索引被稱作復(fù)合索引,本文主要介紹了mysql 聯(lián)合索引生效的條件及索引失效的條件,感興趣的可以了解一下
    2021-11-11
  • Can’t open file:''[Table]mytable.MYI''

    Can’t open file:''[Table]mytable.MYI''

    也許很多人遇到過類似Can’t open file: ‘[Table]mytable.MYI’ 這樣的錯誤信息,卻不知道怎么解決他,下面我們做個介紹,
    2011-01-01
  • MySQL?varchar(n)能存儲幾個漢字

    MySQL?varchar(n)能存儲幾個漢字

    這篇文章主要介紹了MySQL varchar(n)能存儲幾個漢字,MySQL中varchar(n)表示n個字符,無論漢字和英文,Mysql都能存入n個字符,僅是實(shí)際字節(jié)長度有所區(qū)別,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 詳解在MySQL中創(chuàng)建表的教程

    詳解在MySQL中創(chuàng)建表的教程

    這篇文章主要介紹了詳解在MySQL中創(chuàng)建表的教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路解析

    MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路解析

    這篇文章主要為大家介紹了MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MySQL教程DML數(shù)據(jù)操縱語言示例詳解

    MySQL教程DML數(shù)據(jù)操縱語言示例詳解

    這篇文章主要為大家介紹了MySQL教程中DML數(shù)據(jù)操縱語言的示例詳解,要想學(xué)好MySQL最重要的是要先學(xué)好數(shù)據(jù)操縱語言DML,本文對其進(jìn)行了全面的講解
    2021-10-10

最新評論