前言
因?yàn)?SELECT * 查詢語(yǔ)句會(huì)查詢所有的列和行數(shù)據(jù),包括不需要的和重復(fù)的列,因此它會(huì)占用更多的系統(tǒng)資源,導(dǎo)致查詢效率低下。而且,由于傳輸?shù)臄?shù)據(jù)量大,也會(huì)增加網(wǎng)絡(luò)傳輸?shù)呢?fù)擔(dān),降低系統(tǒng)性能。
如果需要查詢所有的列數(shù)據(jù),可以使用 LIMIT 關(guān)鍵字限制查詢的行數(shù),避免傳輸過(guò)多的數(shù)據(jù)。在實(shí)際開(kāi)發(fā)中建議指定列名,避免使用 SELECT * 。
一、適合SELECT * 的使用場(chǎng)景
SELECT * 是 SQL 語(yǔ)句中的一種,用于查詢數(shù)據(jù)表中所有的列和行。它的使用場(chǎng)景有以下幾種:
- 初學(xué)者的練習(xí):當(dāng)學(xué)習(xí) SQL 語(yǔ)言的初學(xué)者沒(méi)有掌握如何選擇特定的列時(shí),可以用 SELECT * 來(lái)查看完整的數(shù)據(jù)表結(jié)構(gòu),這有助于更好地理解數(shù)據(jù)表的組成。
- 快捷查詢:當(dāng)需要查詢數(shù)據(jù)表中所有的數(shù)據(jù)時(shí),SELECT * 可以快捷地查找到所有的數(shù)據(jù),省去了手動(dòng)輸入列名的麻煩。
- 在某些情況下,使用 SELECT * 可以使 SQL 語(yǔ)句更加簡(jiǎn)潔明了,讓代碼更易于維護(hù)和修改。
但SELECT *也有一些潛在的風(fēng)險(xiǎn),比如 SELECT * 可能會(huì)導(dǎo)致查詢效率低下、數(shù)據(jù)冗余和安全問(wèn)題等。
二、SELECT * 會(huì)導(dǎo)致查詢效率低的原因
2.1、數(shù)據(jù)庫(kù)引擎的查詢流程
數(shù)據(jù)庫(kù)引擎的查詢流程通常包含以下幾個(gè)步驟:
- 解析 SQL 語(yǔ)句:數(shù)據(jù)庫(kù)引擎先將 SQL 語(yǔ)句解析成內(nèi)部的執(zhí)行計(jì)劃,包括了查詢哪些數(shù)據(jù)表、使用哪些索引、如何連接多個(gè)數(shù)據(jù)表等信息。
- 優(yōu)化查詢計(jì)劃:數(shù)據(jù)庫(kù)引擎對(duì)內(nèi)部的執(zhí)行計(jì)劃進(jìn)行優(yōu)化,根據(jù)查詢的復(fù)雜度、數(shù)據(jù)量和系統(tǒng)資源等因素,選擇最優(yōu)的執(zhí)行計(jì)劃。
- 執(zhí)行查詢計(jì)劃:數(shù)據(jù)庫(kù)引擎根據(jù)執(zhí)行計(jì)劃,通過(guò) I/O 操作讀取數(shù)據(jù)表的數(shù)據(jù),進(jìn)行數(shù)據(jù)過(guò)濾、排序、分組等操作,最終返回結(jié)果集。
- 緩存查詢結(jié)果:如果查詢結(jié)果集比較大或者查詢頻率較高,數(shù)據(jù)庫(kù)引擎會(huì)將查詢結(jié)果緩存在內(nèi)存中,以加速后續(xù)的查詢操作。
以MySQL為例:
執(zhí)行一條select語(yǔ)句時(shí),會(huì)經(jīng)過(guò):
- 連接器:主要作用是建立連接、管理連接及校驗(yàn)用戶信息。
- 查詢緩沖:查詢緩沖是以key-value的方式存儲(chǔ),key就是查詢語(yǔ)句,value就是查詢語(yǔ)句的查詢結(jié)果集;如果命中直接返回。注意,MySQL 8.0已經(jīng)刪除了查詢緩沖。
- 分析器:詞法句法分析生成語(yǔ)法樹(shù)。
- 優(yōu)化器:指定執(zhí)行計(jì)劃,選擇查詢成本最小的計(jì)劃。
- 執(zhí)行器:根據(jù)執(zhí)行計(jì)劃,從存儲(chǔ)引擎獲取數(shù)據(jù),并返回客戶端。
2.2、SELECT * 的實(shí)際執(zhí)行過(guò)程
當(dāng)使用 SELECT * 查詢語(yǔ)句時(shí),數(shù)據(jù)庫(kù)引擎會(huì)將所有的列都查詢出來(lái),包括不需要的和重復(fù)的列,然后將這些數(shù)據(jù)傳輸?shù)娇蛻舳?。這個(gè)過(guò)程會(huì)涉及以下幾個(gè)步驟:
- 執(zhí)行解析 SQL 語(yǔ)句:當(dāng)數(shù)據(jù)庫(kù)引擎接收到 SELECT * 查詢語(yǔ)句時(shí),會(huì)首先解析該語(yǔ)句,確定需要查詢哪些數(shù)據(jù)表,以及如何連接這些數(shù)據(jù)表,然后將解析結(jié)果保存到內(nèi)部的執(zhí)行計(jì)劃中。
- 執(zhí)行查詢計(jì)劃:根據(jù)執(zhí)行計(jì)劃,數(shù)據(jù)庫(kù)引擎會(huì)掃描相應(yīng)的數(shù)據(jù)表,讀取所有的列和行數(shù)據(jù),然后將這些數(shù)據(jù)傳輸?shù)娇蛻舳恕?/li>
- 數(shù)據(jù)傳輸?shù)娇蛻舳耍阂坏┎樵兺瓿?,?shù)據(jù)庫(kù)引擎將查詢結(jié)果集發(fā)送到客戶端,包括所有的列和行數(shù)據(jù)。
由于 SELECT * 查詢語(yǔ)句會(huì)查詢所有的列和行數(shù)據(jù),包括不需要的和重復(fù)的列,因此它會(huì)占用更多的系統(tǒng)資源,導(dǎo)致查詢效率低下。而且,由于傳輸?shù)臄?shù)據(jù)量大,也會(huì)增加網(wǎng)絡(luò)傳輸?shù)呢?fù)擔(dān),降低系統(tǒng)性能。
2.3、使用 SELECT * 查詢語(yǔ)句帶來(lái)的不良影響
- 查詢效率低下:由于 SELECT * 查詢語(yǔ)句會(huì)查詢所有列和行數(shù)據(jù),包括不需要的和重復(fù)的列,因此會(huì)占用更多的系統(tǒng)資源,導(dǎo)致查詢效率低下。
- 數(shù)據(jù)冗余:使用 SELECT * 查詢語(yǔ)句可能會(huì)查詢出不必要的重復(fù)數(shù)據(jù),增加數(shù)據(jù)庫(kù)的存儲(chǔ)空間,降低數(shù)據(jù)庫(kù)的性能。
- 網(wǎng)絡(luò)傳輸負(fù)擔(dān)增加:由于 SELECT * 查詢語(yǔ)句會(huì)傳輸所有的列和行數(shù)據(jù),因此會(huì)增加網(wǎng)絡(luò)傳輸?shù)呢?fù)擔(dān),降低系統(tǒng)性能。
- 安全問(wèn)題:如果數(shù)據(jù)表中包含敏感信息,使用 SELECT * 查詢語(yǔ)句可能會(huì)泄露敏感信息,引發(fā)安全問(wèn)題。
所以,建議選擇具體的列進(jìn)行查詢。如果需要查詢所有的列數(shù)據(jù),可以使用 LIMIT 關(guān)鍵字限制查詢的行數(shù),避免傳輸過(guò)多的數(shù)據(jù)。
三、優(yōu)化查詢效率的方法
(1)SELECT 顯式指定字段名。SELECT 顯式指定字段名的優(yōu)勢(shì):
-
減少不必要的數(shù)據(jù)傳輸 。
-
減少內(nèi)存消耗。
-
提高查詢效率
-
SELECT 顯式指定字段名的注意事項(xiàng): 掌握數(shù)據(jù)表結(jié)構(gòu)、避免指定過(guò)多的字段 、避免頻繁修改查詢語(yǔ)句。
(2)使用索引。
(3)減少子查詢。
(4)避免使用 OR 操作符。
四、總結(jié)
SELECT * 的不良影響:
- 查詢效率低下;
- 數(shù)據(jù)冗余;
- 網(wǎng)絡(luò)傳輸負(fù)擔(dān)增加;
- 安全問(wèn)題。
顯式指定字段名的優(yōu)勢(shì):
- 查詢效率更高;
- 減少數(shù)據(jù)冗余;
- 網(wǎng)絡(luò)傳輸負(fù)擔(dān)減少;
- 更好的代碼可讀性;
- 提高安全性。
優(yōu)化查詢效率的方法:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-522535.html
- 顯式指定需要查詢的字段名;
- 使用 LIMIT 關(guān)鍵字限制查詢的行數(shù);
- 優(yōu)化索引,提高查詢效率;
- 避免在 WHERE 子句中使用函數(shù)或表達(dá)式,以免影響查詢效率;
- 避免使用子查詢,以免引起性能問(wèn)題;
- 合理使用 JOIN,避免查詢結(jié)果集過(guò)大。
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-522535.html
到了這里,關(guān)于SELECT * 會(huì)導(dǎo)致查詢效率低的原因的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!