原因:
- 不需要的列會增加數據傳輸時間和網絡開銷
- select * 會需要解析更多的對象、字段、權限、屬性等相關內容,會給數據庫造成負擔。
- 增大網絡開銷。* 有時會誤帶上如log、IconMD5之類無用的大文本字段,數據傳輸size會幾何增漲。
- 對於無用的大字段,如varchar、blob、text 會增加io操作
- 長度超過728字節的時候,會先把超出的數據序列化到另一個地方,因此讀取這條記錄會增加一次io操作。
- 失去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+樹查詢,速度必然會慢很多
-
參考:https://mp.weixin.qq.com/s/uUj83OzuHm67R1yG-qajkw
