硬碟7200mysql MySQL服務查詢優化

2021-10-17 20:35:39 字數 3047 閱讀 4731

一、服務介面效能測試相關

tp指標:

如tp50:指在乙個時間段內(如5分鐘),統計該方法每次呼叫所消耗的時間,並將這些時間從小到大的順序進行排序,取第50%的那個值作為tp50值;配置此監控指標對應的報警閾值後,需要保證在這個時間段內該方法所有呼叫的消耗時間至少有50%的值要小於此閾值,否則系統會報警。

響應時間的其他指標:最大值、 平均值等

qps概念:

定義:單個程序每秒請求伺服器的成功次數

tp指標和qps的關係:

tp指標反映的伺服器介面的耗時,qps反映的是單個程序每秒請求伺服器的成功次數。如果伺服器介面的耗時降低,伺服器能夠支撐的qps自然就會上公升。同樣,如果伺服器能夠支撐的qps下降了,說明耗時在增加,tp指標在變差。

在開發完服務介面,可利用jmeter壓測工具測試服務介面的tp指標,分析服務的響應耗時。

二、mysql索引查詢優化原理

2.1 索引原理

資料儲存在磁碟上,為了提高效能,可以把部分資料讀入記憶體來計算,因為訪問磁碟的成本大概是訪問記憶體的10萬倍左右。

傳統的機械磁碟讀取資料靠機械運動,每次讀取所花時間可分為尋道、旋轉延遲、傳輸3部分,尋道時間指磁臂移到指定磁軌所需時間,主流磁碟一般不高於5ms;旋轉延遲即磁碟轉速,比如乙個磁碟7200轉,表示每分鐘能轉7200次,即1秒能轉120次,旋轉延遲就是1/120/2=4.17ms;傳輸時間指將資料寫入或讀出磁碟的時間,一般在零點幾毫秒。綜上,一次磁碟io的時間約9ms,聽起來還好,但是一台500mios的機器每秒可執行5億條指令,因為指令依靠的是電的性質,即執行一次io的時間可以執行約450萬條指令,資料庫資料量動輒百萬乃至千萬級,每次9ms,顯然是個災難。

考慮到磁碟io操作代價高昂,os做了一些優化,當一次io時,不只將當前磁碟位址的資料,還將相鄰的資料也都讀取到記憶體緩衝區,由區域性預讀性原理可知,當計算機訪問乙個位址的資料時,與其相鄰的資料也會很快被訪問到,每次io讀取的資料我們稱之為一頁(page)。具體一頁有多大跟os有關,一般為4k或8k,即每讀取一頁,發生一次io。

由上可知,需要在每次查詢資料時,將磁碟io次數控制在乙個很小的數量級,最好是常量級。乙個高度可控的多路搜尋樹可以滿足這樣的需求。

上圖為一顆b+樹,淺藍色的塊是乙個磁碟塊,每個磁碟塊包含幾個資料項,用深藍色表示,和指標,用黃色表示。如磁碟塊1包含資料項17和35,包含指標p1、p2和p3,p1表示小於17的磁碟塊,p2表示17和35之間的磁碟塊,p3表示大於35的磁碟塊。真實的資料存在於葉子節點即圖中的最下面一層。非葉子節點不存在真實資料,只存指引搜尋方向的資料項,如17、35並不真實存在於資料表。

例如,如果要查詢資料項29,首先會將磁碟塊1載入到記憶體(一次io);在記憶體中用二分查詢確定29在17和35之間,鎖定指標p2,通過p2的磁碟位址將磁碟塊3載入到記憶體(二次io);29在26和30之間,鎖定磁碟塊3的指標p2,通過p2載入磁碟塊8到記憶體(三次io),在記憶體中二分查詢找到29,查詢結束。真實情況是,3層的b+樹可表示上百萬條資料,如果上百萬的資料只需三次io,效能將是巨大的提公升,如果沒有索引,每個資料項都發生一次io,那麼總共需要百萬次io,顯然成本太高。

通過上面的分析,可知io次數取決於b+樹的高度h。假設當前資料表的資料為n,每個磁碟塊的資料項的數量為m,則有:

n固定,m越大,h越小。而m=磁碟塊size/資料項size,磁碟塊大小即乙個資料頁的大小是固定的,如果資料項佔的空間越小,資料項的數量越多,樹的高度越低。這就是為什麼每個資料項,即索引欄位要盡量小,這也是為什麼b+樹要求把真實的資料放到葉子節點。

當b+樹的資料項是復合的資料結構(比如name,age,***)時,b+樹按照從左到右的順序建立搜尋樹。比如當(張三,20,f)這樣的資料來檢索時,b+樹會優先確定name,如果name相同再依次比較age和***,最後得到檢索的資料;但當(20,f)這樣的資料來檢索時,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹時name時第乙個比較因子,必須要先根據name來搜尋才能知道下一步去**。比如當(張三,f)這樣的資料來檢索時,b+樹可用name來指定搜尋方向,但因下一欄位age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是f的資料了。這個性質稱為索引的最左匹配特性。

2.2 主鍵索引和普通索引

每張表都有主鍵索引,且是根據主鍵順序存放資料的,如果建表時未定義主鍵,則資料庫會自己生成rowid當主鍵。主鍵索引又被稱為聚簇索引。主鍵索引的b+樹的葉子節點儲存的是正行資料。

普通索引又稱為二級索引或非主鍵索引,在b+樹的葉子節點儲存的是主鍵值。如下面的sql語句:

select b from t where a=10

在執行時,資料庫會在a的索引表中查詢a='xx'對應到的主鍵值,再用這個主鍵到主鍵索引中查詢需要的資料,這個過程叫做回表操作。

2.3 覆蓋索引和索引下推

上面提到在執行sql時,會執行回表操作,回表操作多查詢一次主鍵索引樹,影響了效率。那有什麼辦法可以避免呢?答案就是建立乙個聯合索引index index_a_b (a, b),這樣資料在查詢時就直接拿到了需要的b欄位的值,不需要再進行回表操作。例如查詢主鍵sql也是不需要回表操作的,這個就是覆蓋索引的概念了。

索引下推是mysql5.6引入的功能,指的是可以在遍歷的過程中就對包含的字段先做判斷,直接過濾掉不符合條件的資料,減少回表操作。

例如下面這條sql語句:

select * from t where a>10 and a<20 and b='xx'

如果沒有索引下推功能,這條語句的執行過程是這樣的:判斷a是否大於10且小於20

如果步驟1不滿足條件,則進行下一條記錄。如果步驟1滿足條件,則從a的索引樹種取得對應的主鍵進行回表操作

回表操作取得整行資料,取b的值判斷是否等於'xx',如果是,取出資料。重複步驟1和步驟2,直至a大於等於20終止

上面的執行過程中如果滿足步驟1的資料有100條,但同時滿足t.b='xx'的資料只有10條,資料庫卻需要回表100次。

引入索引下推後,執行過程如下:判斷a是否大於10且小於20

如果步驟1不滿足條件,則進行下一條記錄。如果步驟1滿足條件,則繼續判斷b是否等於''xx'。如果不滿足,則進行下一條記錄,如果滿足,則從a的索引樹中取得對應的主鍵進行回表操作,取出資料

重複步驟1和步驟2,直至a大於等於20終止

在引入索引下推後,整個過程只需要回表10次,大大減少了回表操作。

SSD硬碟與7200轉機械硬碟速度對比

1 dd部分 root node1 free g total used free shared buffers cached mem 7 0 6 0 0 0 buffers cache 0 7 swap 3 0 3 root node1 ls dev sd sda sda1 sda2 sda5 sd...

mysql 硬碟加密碼 MySQL 密碼相關

登入使用者 當mysql客戶端進行使用者登陸之後,可以使用以下命令顯示所登入的使用者 mysql select user user root localhost 1 row in set 0.00 sec 如果直接輸入mysql命令而不指定使用者名稱,則是以遊客賬戶odbc 進行登入 設定密碼 初始...

VPS硬碟小心 你的mysql日誌

4月份買了臺新的 vps 從 linode 遷出 實在受不鳥 linode 日本節點 晚上那個卡,而且本身 日本linode的 也有些許貴,支撐不起啊。512m記憶體的日本linode就要 140多 而我當時新購的 vps 才 120多 1g記憶體。和 硬碟 io效果 都遠不如新的vps,好吧 雖然...