mysql and 和where,关于mysql:连接sql查询中where和and子句的区别
本問題已經(jīng)有最佳答案,請(qǐng)猛點(diǎn)這里訪問。
下面兩個(gè)SQL查詢有什么區(qū)別
和
號(hào)
根據(jù)以下兩個(gè)測(cè)試結(jié)果
速度更快(237比460)。據(jù)我所知,這是一個(gè)標(biāo)準(zhǔn)。
。
氧化鎂
不,有細(xì)微的差別,你不能說沒有差別
除了語法之外沒有別的區(qū)別。
雖然只有一個(gè)簡(jiǎn)短的句子,但這仍然是一個(gè)有效的答案。
以及一個(gè)非常精確、準(zhǔn)確和相關(guān)的答案。
它只是對(duì)on條件進(jìn)行過濾,而不是添加一個(gè)where過濾器。所做的沒有區(qū)別,只是沒有一個(gè)地方比較慢。他的回答完全足夠了
以這種方式考慮,在聯(lián)接時(shí),表中的行與其他表中的行在兩個(gè)條件下(經(jīng)過它兩次)進(jìn)行比較…而不是在連接后進(jìn)行一次,然后查找非空結(jié)果。這就是為什么它更快
這不是一個(gè)正確的答案(盡管這是常見的誤解)。通常,這兩個(gè)命令之間沒有明顯的區(qū)別,因?yàn)椴樵儍?yōu)化器將重寫查詢以使用更好的語法。但是,這兩個(gè)查詢的運(yùn)行順序有著根本的區(qū)別。FROM子句在WHERE之前進(jìn)行評(píng)估,并在更復(fù)雜的查詢中給出截然不同的執(zhí)行計(jì)劃。要驗(yàn)證,請(qǐng)使用提示忽略優(yōu)化器的更改,并使用解釋計(jì)劃查看執(zhí)行路徑的差異。
這很有趣-謝謝你指出這一點(diǎn)。如果我錯(cuò)了,請(qǐng)糾正我,只是再次回顧查詢,我認(rèn)為即使是結(jié)果也會(huì)與上述兩個(gè)查詢完全不同。查詢1不會(huì)返回a.name為空的記錄。查詢2將返回a.name為空的記錄,因?yàn)楸韆位于聯(lián)接的左側(cè)。如果我們從表B中選擇一列,我們會(huì)看到結(jié)果顯示為空,即使我們?cè)贗D上匹配。
執(zhí)行聯(lián)接,然后執(zhí)行篩選器
在聯(lián)接前執(zhí)行篩選器(更好的性能)
編輯:上面是我的原始答案,下面支持它。
4個(gè)表,4個(gè)左聯(lián)接,大約500000個(gè)結(jié)果,第二個(gè)查詢?cè)谝话霑r(shí)間內(nèi)運(yùn)行。在測(cè)試查詢效率時(shí),您應(yīng)該選擇更大的工作集…或是CPU負(fù)載、RAM使用、連接時(shí)間等因素。如果您的記錄少于1000條,或者流量優(yōu)化有限,則很難看到或證明這一點(diǎn)。在生產(chǎn)環(huán)境中測(cè)試您的工作集并使用性能更好的東西(不僅僅是理論上的)很簡(jiǎn)單。
網(wǎng)址:http://www.beaudurant.com/images/sof/22302649.jpg
您可以看到我的數(shù)據(jù)集在效率和結(jié)果上的差異。此示例使用的是MySQL數(shù)據(jù)庫。
452734記錄420.016秒
452747記錄在214.334秒內(nèi)
注意:查詢是故意運(yùn)行緩慢的。
我可以在4+表(內(nèi)部)聯(lián)接上發(fā)布10000000條記錄的示例…在我的例子中,添加和到每個(gè)聯(lián)接會(huì)更快,然后等待直到最后以一個(gè)where結(jié)束???0秒以上…
表達(dá)式的語法外觀與實(shí)際用于計(jì)算結(jié)果的策略無關(guān)。從未聽說過"查詢優(yōu)化器"這個(gè)詞?
你們中有人愿意看我的結(jié)果嗎?您使用大型數(shù)據(jù)集嗎?
歐文-你錯(cuò)了……句法外觀與查詢策略有關(guān)。優(yōu)化器只知道如何編寫比您更好的查詢(基于對(duì)數(shù)據(jù)和元數(shù)據(jù)的復(fù)雜分析),因此更改執(zhí)行計(jì)劃以編寫您的意思而不是編寫的內(nèi)容。這就是執(zhí)行計(jì)劃隨著表中數(shù)據(jù)的變化而隨時(shí)間變化的原因。但是,編寫查詢的順序會(huì)影響優(yōu)化器的編譯。
歐文-是女士嗎?我主要使用MySQL、Berkeley、SQLite和MSSQL。這個(gè)例子是mysql,盡管我可以在mssql上顯示相同的結(jié)果(不同的表和數(shù)據(jù))。我喜歡做事情,而不是讓微軟為我做決定。
總結(jié)
以上是生活随笔為你收集整理的mysql and 和where,关于mysql:连接sql查询中where和and子句的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雪莲冰块5毛一包的定价13年没涨!利润只
- 下一篇: 华为鸿蒙OS 3.0正式版前瞻:升级机型