select 為什麼效率低

2021-10-08 09:48:00 字數 1741 閱讀 1020

索引知識延申

3. 索引是建的越多越好嗎

增大網路開銷;* 有時會誤帶上如log、iconmd5之類的無用且大文字字段,資料傳輸size會幾何增漲。如果db和應用程式不在同一臺機器,這種開銷非常明顯

即使 mysql 伺服器和客戶端是在同一臺機器上,使用的協議還是 tcp,通訊也是需要額外的時間。

準確來說,長度超過 728 位元組的時候,會先把超出的資料序列化到另外乙個地方,因此讀取這條記錄會增加一次 io 操作。

select *杜絕了覆蓋索引的可能性,而基於mysql優化器的「覆蓋索引」策略又是速度極快,效率極高,業界極為推薦的查詢優化方式。

例如,有乙個表為t(a,b,c,d,e,f),其中,a為主鍵,b列有索引。

那麼,在磁碟上有兩棵 b+ 樹,即聚集索引和輔助索引(包括單列索引、聯合索引),分別儲存(a,b,c,d,e,f)和(a,b),如果查詢條件中where條件可以通過b列的索引過濾掉一部分記錄,查詢就會先走輔助索引,如果使用者只需要a列和b列的資料,直接通過輔助索引就可以知道使用者查詢的資料。

如果使用者使用select *,獲取了不需要的資料,則首先通過輔助索引過濾資料,然後再通過聚集索引獲取所有的列,這就多了一次b+樹查詢,速度必然會慢很多

mysql索引 - b+樹:mysql索引 - b+樹

由於輔助索引的資料比聚集索引少很多,很多情況下,通過輔助索引進行覆蓋索引(通過索引就能獲取使用者需要的所有列),都不需要讀磁碟,直接從記憶體取,而聚集索引很可能資料在磁碟(外存)中(取決於buffer pool的大小和命中率),這種情況下,乙個是記憶體讀,乙個是磁碟讀,速度差異就很顯著了,幾乎是數量級的差異。

上面提到了輔助索引,在mysql中輔助索引包括單列索引、聯合索引(多列聯合),單列索引就不再贅述了,這裡提一下聯合索引的作用

聯合索引 (a,b,c) 實際建立了 (a)、(a,b)、(a,b,c) 三個索引

我們可以將組合索引想成書的一級目錄、二級目錄、**目錄,如index(a,b,c),相當於a是一級目錄,b是一級目錄下的二級目錄,c是二級目錄下的**目錄。要使用某一目錄,必須先使用其上級目錄,一級目錄除外。

建乙個聯合索引 (a,b,c) ,實際相當於建了 (a)、(a,b)、(a,b,c) 三個索引。每多乙個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量資料的表,使用聯合索引會大大的減少開銷!

對聯合索引 (a,b,c),如果有如下 sql 的:

select a,b,c from table where a=

'xx' and b =

'xx'

;

那麼 mysql 可以直接通過遍歷索引取得資料,而無需回表,這減少了很多的隨機 io 操作。減少 io 操作,特別是隨機 io 其實是 dba 主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提公升效能的優化手段之一。

索引列多,通過聯合索引篩選出的資料越少。比如有 1000w 條資料的表,有如下sql:

select c1,c2,c3 from table where c1=

1 and c2=

2 and c3=

3;

假設:假設每個條件可以篩選出 10% 的資料。

答案自然是否定的

為什麼ArrayList增刪效率低,及其擴容機制

首先,modcount是arraylist的父類abstractlist中的變數,記錄的是關於元素的數目被修改的次數,預設值為0。增與刪操作時,modcount一定會進行修改。改和查時modcount一定不會修改。arraylist底層是陣列,查詢時間複雜度為 o 1 刪除 新增時間複雜度為 o n...

為什麼開發效率這麼低,時間都去哪了

在埋頭打碼的時候,總會雲遊天外思考點人生問題,回過神來吐槽自己 開發效率為何這麼低!明明實現的業務邏輯並不是很複雜,量也不會太多,為什麼專案的開發要那麼久?時間到底去哪了?一次兩次的問題,或許我們不會在意。但頻頻爆發的問題,這就值得我們深思了。這不是個單因單果的問題,找出潛在的可能因素,才能給出針對...

MTP效率這麼低,為什麼還被眾多手機採用?

比如檢視手機上的 資料夾,mtp要幾分鐘才顯示完畢所有檔案。傳大量小檔案的速度更是慘不忍睹。如果android手機的sdcard以mtp模式掛載到pc機上,sdcard的控制權其實還是屬於手機。只不過智慧型手機通過mtp協議向pc機構建了乙個虛擬檔案系統。pc機操作其中的檔案時,都會通過標準mtp協...