SQL優(yōu)化的N種方法(小結(jié))
1.SQL語(yǔ)句中IN包含的值不應(yīng)過(guò)多:
例如:select id from handsome where number in(1,2,3) 對(duì)于連續(xù)的數(shù)值,能用between就不要用in了。
2.SELECT語(yǔ)句務(wù)必指明字段名稱(chēng):
禁止用 * 來(lái)查詢(xún) ,禁止用 * 來(lái)查詢(xún) ,禁止用 * 來(lái)查詢(xún) ,重要的事情說(shuō)三遍, 查找哪個(gè)字段,就寫(xiě)具體的字段。
3.只查詢(xún)一條數(shù)據(jù)的時(shí)候,使用limit 1
【這個(gè)很有用】
4.避免在where子句中對(duì)字段進(jìn)行null值判斷
5.避免在where子句中對(duì)字段進(jìn)行表達(dá)式操作:
select id from user WHERE id*100=500;
上面的sql對(duì)字段就行了算術(shù)運(yùn)算,這會(huì)造成引擎放棄使用索引,建議改成:
select id from user WHERE id=500/100;
6.對(duì)于聯(lián)合索引來(lái)說(shuō),要遵守最左前綴法則:
例如組合索引(id,name,sex) 使用的時(shí)候,可以id 或者id,name 。禁止直接name,或者sex會(huì)導(dǎo)致聯(lián)合索引失敗
注意: id, name,sex 這三個(gè)字段填寫(xiě)順序不會(huì)有影響, mysql會(huì)自動(dòng)優(yōu)化成最左匹配的順序
前三條sql都能命中索引,中間兩條由于不符合最左匹配原則,索引失效
最后一條sql 由于有最左索引id 所以索引部分成功,部分失效. id字段索引使用成功
explain select * from ?`user_test` where uid=10 ?;? explain select * from ?`user_test` where uid=10 and name='識(shí)時(shí)務(wù)者';? explain select * from ?`user_test` where uid=10 and name='識(shí)時(shí)務(wù)者' and phone='13047967256';? explain select * from ?`user_test` where name='識(shí)時(shí)務(wù)者' and phone='13047967256';? explain select * from ?`user_test` where name='識(shí)時(shí)務(wù)者';? explain select * from ?`user_test` where uid=10 and phone='13047967256';?
7.盡量使用inner join,避免left join:
如果連接方式是inner join,在沒(méi)有其他過(guò)濾條件的情況下MySQL會(huì)自動(dòng)選擇小表作為驅(qū)動(dòng)表,但是left join在驅(qū)動(dòng)表的選擇上遵循的是左邊驅(qū)動(dòng)右邊的原則,即left join左邊的表名為驅(qū)動(dòng)表。
8.注意范圍查詢(xún)語(yǔ)句:
對(duì)于聯(lián)合索引來(lái)說(shuō),如果存在范圍查詢(xún),比如between、>、<等條件時(shí),會(huì)造成后面的索引字段失效。
解決辦法: 業(yè)務(wù)允許的情況下,使用 >= 或者<= 這樣不影響索引的使用
9.不建議使用%前綴模糊查詢(xún):
例如 : LIKE“%name”或者LIKE“%name%”,這種查詢(xún)會(huì)導(dǎo)致索引失效而進(jìn)行全表掃描。但是可以使用LIKE “name%”。
10.在 where 子句中使用 or 來(lái)連接條件,如果or連接的條件有一方?jīng)]有索引,將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
解決辦法: 將or連接的雙方都建立索引,就可以使用
11.應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
12.字符串類(lèi)型的字段 查詢(xún)的時(shí)候如果不加引號(hào)’’ ,會(huì)導(dǎo)致自動(dòng)進(jìn)行隱式轉(zhuǎn)換,然后索引失效
到此這篇關(guān)于SQL優(yōu)化的N種方法(小結(jié))的文章就介紹到這了,更多相關(guān)SQL 優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sql server 中合并某個(gè)字段值的實(shí)例
sql server 中合并某個(gè)字段值的實(shí)例,需要的朋友可以參考一下2013-03-03
SQL?Server數(shù)據(jù)庫(kù)如何查看表的數(shù)據(jù)內(nèi)容
查詢(xún)數(shù)據(jù)在數(shù)據(jù)庫(kù)的操作中相當(dāng)重要的,在項(xiàng)目實(shí)訓(xùn)中查詢(xún)是經(jīng)常要用到的,所以掌握數(shù)據(jù)庫(kù)的查詢(xún)是基本要求,這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫(kù)如何查看表的數(shù)據(jù)內(nèi)容的相關(guān)資料,需要的朋友可以參考下2023-11-11
SQL Server數(shù)據(jù)庫(kù)錯(cuò)誤829的修復(fù)辦法
SQL Server 錯(cuò)誤 829 是與 SQL Server 頁(yè)面相關(guān)的錯(cuò)誤,當(dāng)用戶(hù)嘗試自動(dòng)修復(fù)主數(shù)據(jù)庫(kù)中的頁(yè)面,但由于某種原因而失敗時(shí),可能會(huì)發(fā)生 SQL Server 錯(cuò)誤 829,所以本文給大家介紹了如何修復(fù) SQL Server 數(shù)據(jù)庫(kù)錯(cuò)誤 829,需要的朋友可以參考下2024-08-08
SQL Server 海量數(shù)據(jù)導(dǎo)入的最快方法
這篇論壇文章(賽迪網(wǎng)技術(shù)社區(qū))詳細(xì)講解了SQL Server海量數(shù)據(jù)導(dǎo)入的最快方法,更多內(nèi)容請(qǐng)參考下文2008-12-12
SQL Server解析XML數(shù)據(jù)的方法詳解
這篇文章主要介紹了SQL Server解析XML數(shù)據(jù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了SQL Server針對(duì)xml數(shù)據(jù)的讀取,遍歷,刪除,查找等常用操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
SQL Server 2012 開(kāi)窗函數(shù)
這篇文章主要介紹了SQL Server 2012 開(kāi)窗函數(shù)功能的實(shí)例代碼,具體代碼如下所示2017-01-01
sqlserver中查找所有包含了某個(gè)文本的存儲(chǔ)過(guò)程
我想查找所有使用了sp_a 的存儲(chǔ)過(guò)程。右擊sp_a->view dependencies-> 選擇 view objects that depend on [sp_a] 你會(huì)發(fā)現(xiàn),有時(shí)候結(jié)果不能夠全部列出來(lái),不能夠找到所有使用了sp_a的其他存儲(chǔ)過(guò)程。2010-05-05
SQL CONVERT轉(zhuǎn)化函數(shù)使用方法小結(jié)
此樣式一般在時(shí)間類(lèi)型(datetime,smalldatetime)與字符串類(lèi)型(nchar,nvarchar,char,varchar) 相互轉(zhuǎn)換的時(shí)候才用到.2010-05-05
使用SQL SERVER存儲(chǔ)過(guò)程實(shí)現(xiàn)歷史數(shù)據(jù)遷移方式
這篇文章主要介紹了使用SQL SERVER存儲(chǔ)過(guò)程實(shí)現(xiàn)歷史數(shù)據(jù)遷移,介紹了歷史數(shù)據(jù)遷移的基本概念及目的,對(duì)SQL SERVER存儲(chǔ)過(guò)程歷史數(shù)據(jù)遷移知識(shí)感興趣的朋友參考下吧2021-09-09

