為什么大家都說 SELECT * 效率低

一、效率低的原因 1. 不需要的列會(huì)增加數(shù)據(jù)傳輸時(shí)間和網(wǎng)絡(luò)開銷 2. 對(duì)于無用的大字段,如 varchar、blob、text,會(huì)增加 io 操作 3. 失去MySQL優(yōu)化器“覆蓋索引”策略優(yōu)化的可能性 二、索引知識(shí)延申 聯(lián)合索引 (a,b,c) 聯(lián)合索引的優(yōu)勢(shì) 索引是建的越多越好嗎 三、心得體會(huì)

一、效率低的原因
增加查詢分析器解析成本。 增減字段容易與 resultMap 配置不一致。 無用字段增加網(wǎng)絡(luò) 消耗,尤其是 text 類型的字段。
1. 不需要的列會(huì)增加數(shù)據(jù)傳輸時(shí)間和網(wǎng)絡(luò)開銷
用“SELECT * ”數(shù)據(jù)庫需要解析更多的對(duì)象、字段、權(quán)限、屬性等相關(guān)內(nèi)容,在 SQL 語句復(fù)雜,硬解析較多的情況下,會(huì)對(duì)數(shù)據(jù)庫造成沉重的負(fù)擔(dān)。 增大網(wǎng)絡(luò)開銷;* 有時(shí)會(huì)誤帶上如log、IconMD5之類的無用且大文本字段,數(shù)據(jù)傳輸size會(huì)幾何增漲。如果DB和應(yīng)用程序不在同一臺(tái)機(jī)器,這種開銷非常明顯 即使 mysql 服務(wù)器和客戶端是在同一臺(tái)機(jī)器上,使用的協(xié)議還是 tcp,通信也是需要額外的時(shí)間。
2. 對(duì)于無用的大字段,如 varchar、blob、text,會(huì)增加 io 操作
3. 失去MySQL優(yōu)化器“覆蓋索引”策略優(yōu)化的可能性


二、索引知識(shí)延申
聯(lián)合索引 (a,b,c)

聯(lián)合索引的優(yōu)勢(shì)
1) 減少開銷
2)覆蓋索引
SELECT?a,b,c?from?table?where?a='xx'?and?b?=?'xx';
3)效率高
select?col1,col2,col3?from?table?where?col1=1?and?col2=2?and?col3=3;
A. 如果只有單列索引,那么通過該索引能篩選出 1000W10%=100w 條數(shù)據(jù),然后再回表從 100w 條數(shù)據(jù)中找到符合 col2=2 and col3= 3 的數(shù)據(jù),然后再排序,再分頁,以此類推(遞歸); B. 如果是(col1,col2,col3)聯(lián)合索引,通過三列索引篩選出 1000w10% 10% *10%=1w,效率提升可想而知!
索引是建的越多越好嗎
數(shù)據(jù)量小的表不需要建立索引,建立會(huì)增加額外的索引開銷 不經(jīng)常引用的列不要建立索引,因?yàn)椴怀S茫词菇⒘怂饕矝]有多大意義 經(jīng)常頻繁更新的列不要建立索引,因?yàn)榭隙〞?huì)影響插入或更新的效率 數(shù)據(jù)重復(fù)且分布平均的字段,因此他建立索引就沒有太大的效果(例如性別字段,只有男女,不適合建立索引) 數(shù)據(jù)變更需要維護(hù)索引,意味著索引越多維護(hù)成本越高。 更多的索引也需要更多的存儲(chǔ)空間
三、心得體會(huì)
---END--- 重磅!碼農(nóng)突圍-技術(shù)交流群已成立 掃碼可添加碼農(nóng)突圍助手,可申請(qǐng)加入碼農(nóng)突圍大群和細(xì)分方向群,細(xì)分方向已涵蓋:Java、Python、機(jī)器學(xué)習(xí)、大數(shù)據(jù)、人工智能等群。 一定要備注:開發(fā)方向+地點(diǎn)+學(xué)校/公司+昵稱(如Java開發(fā)+上海+拼夕夕+猴子),根據(jù)格式備注,可更快被通過且邀請(qǐng)進(jìn)群 ▲長按加群 推薦閱讀
? ?天天在用 Stream,那你知道如此強(qiáng)大的 Stream 的實(shí)現(xiàn)原理嗎? ???項(xiàng)目是如何死掉的?太過真實(shí)! ???太牛了!高考失利只能進(jìn)清華,35歲成阿里最年輕技術(shù)副總裁,他來自另一個(gè)平行世界! ???數(shù)據(jù)庫鏈接池終于搞對(duì)了,這次直接從100ms優(yōu)化到3ms! ?? Google 再見 Java ?? 面試官:我把數(shù)據(jù)庫部署在Docker容器內(nèi),你覺得如何? 最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?BAT?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 如有收獲,點(diǎn)個(gè)在看,誠摯感謝 明天見(??ω??)??
評(píng)論
圖片
表情

