select * 和 select 字段的區別
摘要:介紹 select * 和 select 字段的區別,建議各位不要使用 select * 。
??在千萬級表中查詢數據的時候,需要千方百計提升查詢效率,為用戶帶來最爽的體驗;業界各位大佬都提到 select * 的效率會低于select字段,且推薦使用select字段。就連《阿里Java開發手冊》也明確表示不得使用 select * 作為查詢的字段列表,更是讓這條金科玉律擁有了權威的加持。
查詢效率
??select * 在系統解析的時候,會多一步從系統表獲取具體字段、權限、屬性等相關內容的步驟,即先執行Query Table Metadata For Columns,一定程度上為數據庫增加了負擔。而后者無此過程。
網絡帶寬
??結果集的數據量也會直接影響響應速度。select * 會查出所有的字段,有些是不需要的。尤其是當應用程序和服務器不在同一個局域網時,冗余字段過多,會影響網絡傳輸的性能。這一點在查詢表存在大字段的情況下愈發明顯,大量數據的傳輸必然消耗更多網絡帶寬,拖慢傳輸速度。
結果集擴展能力
??在表結構保持不變的前提下,核心結果集相同,但是select 字段的順序可以調整,select * 則固定不變,和表結構中字段定義順序保持一致。如果修改了表結構,select * 能夠獲得新表結構的所有字段;select 字段在增加字段時不會輸出新字段,而且若被查詢字段出現被重命名或者被刪除的情況,則會報錯。
應用場景
??select * 效率稍低但是能應對頻繁調整的表結構,適應力強,可應用于開發環境,僅極少數特殊業務場景會在生產環境使用;后者效率稍高,語義明確,更能清晰的表達業務需求,強烈推薦在生產環境中使用。
覆蓋索引
??在 MySQL 中,索引和數據是存在一起的,如果查詢的數據和搜索條件在某個索引上就能夠找到,也就是使用了覆蓋索引,能夠直接摒棄回表操作,減少IO次數,速度必然比去磁盤掃描快的多。如果 MySQL 和應用程序不在同一臺機器,那么這種開銷就會更加明顯。因此,在使用 select 的時候,建議讓搜索的字段和查詢條件是索引上的字段信息。
連接查詢時,* 無法進入緩沖池
??MySQL 中連接查詢的原理是先對主表(驅動表)進行查詢操作,然后再用從驅動表得到的數據作為條件,逐條的到被驅動表進行查詢。
??每次驅動表加載一條數據到內存中,然后被驅動表所有的數據都需要往內存中加載一遍進行比較。效率很低,所以mysql中可以指定一個緩沖池的大小,緩沖池大的話可以同時加載多條驅動表的數據進行比較,放的數據條數越多性能io操作就越少,性能也就越好。所以,如果此時使用select * 放一些無用的列,只會白白的占用緩沖空間,浪費本可以提高性能的機會。
結束語
??文章到這里就結束了,看完之后你有什么想法想要跟大家分享呢?評論區在等著你!
Reference
Buy me a coffee. ?Get red packets.
浙公網安備 33010602011771號