碎片為什麼會導致mysql查詢訪問變慢

2021-07-24 12:34:24 字數 1000 閱讀 7202

mysql查詢包括根據一級索引查詢和二級索引查詢,一級索引可以根據主鍵進行查詢,為了避免行間碎片化和頁的**,一般主鍵列為自增長的型別。查詢一般按照業務邏輯索引進行查詢,這就是二級索引查詢。會根據索引查到對應條件的主鍵,根據查詢到的主鍵再定位到具體的資料

mysql資料訪問的瓶頸在於io訪問,對於順序訪問能夠提高io的訪問速度,對於隨機訪問硬碟io的速度就會慢很多

碎片主要有兩種,索引的碎片化和資料儲存的碎片化

b-tree需要隨機的磁碟訪問才能定位到葉子頁,所以如果葉子節點在物理分布上是順序且緊密的,那麼查詢的效果會比較好,否則對於範圍查詢和索引覆蓋掃瞄來說,速度會降低很多

b+ tree索引碎片化,這會降低查詢的效率,碎片化的索引可能會以很差或者無序的方式儲存在硬碟上。

資料儲存碎片化主要包括三種,行碎片化,行間碎片,剩餘空間碎片

這種碎片化是因為一行資料太長,一頁儲存不下,導致資料存在兩個頁中,這樣一行資料訪問把兩個page讀取到記憶體中,無疑增加了io訪問延遲。這種解決辦法是一般將資料的基本資訊存在乙個表中,將資料的拓展資訊另行儲存。比如乙個user的基本資訊儲存在user表中,而使用者的其他關係另行儲存,這樣有利於將乙個使用者的資訊儲存在乙個頁中。

對於行間碎片,是因為對於實際邏輯相鄰的兩行實際上在物理邏輯上不是連續的。這一般是因為對資料的不斷刪除和插入導致的,對於查詢一定範圍的資料,在邏輯上應該是連續的,但是對於資料使用過程中不斷刪除和插入匯入的頁**和資料的重新儲存,

剩餘空間碎片是由於對於乙個page呼叫,而這個page中不是所有的size都儲存著資料,導致乙個page呼叫查詢的結果只能得到較少的結果。

對於發生碎片的表可以採用兩種方法解決 optimize table,對於不支援optimize table的engine來說可以使用,alter table engine=;

b-tree需要隨機的磁碟訪問才能定位到葉子頁,所以如果葉子節點在物理分布上是順序且緊密的,那麼查詢的效果會比較好,否則對於範圍查詢和索引覆蓋掃瞄來說,速度會降低很多

對於索引的碎片化,可以通過刪除索引和重建索引來解決

為什麼迴圈引用會導致「記憶體洩漏」

首先這個問題對於現代瀏覽器 ie9 來說已經不是問題了,這個問題其實是出現在ie8的時代了 我們主要是通過這個問題來介紹下瀏覽器的垃圾 機制 js是有自己的一套自動垃圾 機制的,這是大部分高階語言都具備的 除了c語言 然而它的機制是什麼呢?採用過的有2種 標記清除 和 引用計數 先明確一點現代瀏覽器...

為什麼對string呼叫swap會導致迭代器失效

一般來說,swap操作將容器內容交換不會導致容器的指標 引用 迭代器失效。但當容器型別為array和string時除外。原因在於 sso short string optimization 指c 針對短字串的優化。預設情況下,c 的std string都是儲存在heap中,導致訪問std strin...

PHP 原始碼探秘 為什麼 trim 會導致亂碼

我的部落格 執行以下 tag 網際網路產品 text rtrim tag,print r text 我們可能以為會得到的結果是網際網路產品,實際結果是網際網路產 為什麼會這樣呢?php 裡使用mb 字首的都是多位元組函式 比如 str abcd print r strlen str n 4 prin...