原創(chuàng) | SQL優(yōu)化之如何高效查詢
點(diǎn)擊上方SQL數(shù)據(jù)庫(kù)開(kāi)發(fā),關(guān)注獲取SQL視頻教程
SQL專欄
- 盡量不要使用NULL當(dāng)默認(rèn)值在有索引的列上如果存在NULL值會(huì)使得索引失效,降低查詢速度,該如何優(yōu)化呢?例如:SELECT * ?FROM [Sales].[Temp_SalesOrder] WHERE UnitPrice IS NULL我們可以將NULL的值設(shè)置成0或其他固定數(shù)值,這樣保證索引能夠繼續(xù)有效。SELECT * ?FROM [Sales].[Temp_SalesOrder] WHERE UnitPrice =0這是改寫(xiě)后的查詢語(yǔ)句,效率會(huì)比上面的快很多。
- 盡量不要在WHERE條件語(yǔ)句中使用!=或<>在WHERE語(yǔ)句中使用!=或<>也會(huì)使得索引失效,進(jìn)而進(jìn)行全表掃描,這樣就會(huì)花費(fèi)較長(zhǎng)時(shí)間了。
- 應(yīng)盡量避免在 WHERE子句中使用 OR遇到有OR的情況,我們可以將OR使用UNION ALL來(lái)進(jìn)行改寫(xiě)例如:SELECT * FROM T1 WHERE NUM=10 OR NUM=20可以改寫(xiě)成SELECT * FROM T1 WHERE NUM=10UNION ALLSELECT * FROM T1 WHERE NUM=20
- IN和NOT IN也要慎用遇到連續(xù)確切值的時(shí)候?,我們可以使用BETWEEN AND來(lái)進(jìn)行優(yōu)化例如:SELECT * FROM T1 WHERE NUM IN (5,6,7,8)可以改寫(xiě)成:SELECT * FROM T1 WHERE NUM BETWEEN 5 AND 8.
- 子查詢中的IN可以使用EXISTS來(lái)代替子查詢中經(jīng)常會(huì)使用到IN,如果換成EXISTS做關(guān)聯(lián)查詢會(huì)更快例如:SELECT * FROM T1 WHERE ORDER_ID IN (SELECT ORDER_ID FROM ORDER WHERE PRICE>20);可以改寫(xiě)成:SELECT * FROM T1 AS A WHERE EXISTS (SELECT 1 FROM ORDER ?AS B WHERE A.ORDER_ID=B.ORDER_ID AND B.PRICE>20)雖然代碼量可能比上面的多一點(diǎn),但是在使用效果上會(huì)優(yōu)于上面的查詢語(yǔ)句。
- 模糊匹配盡量使用后置匹配在進(jìn)行模糊查詢,使用LIKE時(shí)盡量使用后置匹配,這樣會(huì)走索引,減少查詢時(shí)間。例如:SELECT * FROM T1 WHERE NAME LIKE '%李四%'或者SELECT * FROM T1 WHERE NAME LIKE '%李四'均不會(huì)走索引,只有當(dāng)如下情況SELECT * FROM T1 WHERE NAME LIKE '李四%'才會(huì)走索引。
——End——
后臺(tái)回復(fù)關(guān)鍵字:資料領(lǐng)取,獲取一份精心整理的技術(shù)干貨
后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
推薦閱讀
點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營(yíng)評(píng)論
圖片
表情
