SQL優(yōu)化的N種方法(小結(jié))
1.SQL語句中IN包含的值不應(yīng)過多:
例如:select id from handsome where number in(1,2,3) 對于連續(xù)的數(shù)值,能用between就不要用in了。
2.SELECT語句務(wù)必指明字段名稱:
禁止用 * 來查詢 ,禁止用 * 來查詢 ,禁止用 * 來查詢 ,重要的事情說三遍, 查找哪個字段,就寫具體的字段。
3.只查詢一條數(shù)據(jù)的時候,使用limit 1
【這個很有用】
4.避免在where子句中對字段進(jìn)行null值判斷
5.避免在where子句中對字段進(jìn)行表達(dá)式操作:
select id from user WHERE id*100=500;
上面的sql對字段就行了算術(shù)運(yùn)算,這會造成引擎放棄使用索引,建議改成:
select id from user WHERE id=500/100;
6.對于聯(lián)合索引來說,要遵守最左前綴法則:
例如組合索引(id,name,sex) 使用的時候,可以id 或者id,name 。禁止直接name,或者sex會導(dǎo)致聯(lián)合索引失敗
注意: id, name,sex 這三個字段填寫順序不會有影響, mysql會自動優(yōu)化成最左匹配的順序
前三條sql都能命中索引,中間兩條由于不符合最左匹配原則,索引失效
最后一條sql 由于有最左索引id 所以索引部分成功,部分失效. id字段索引使用成功
explain select * from ?`user_test` where uid=10 ?;? explain select * from ?`user_test` where uid=10 and name='識時務(wù)者';? explain select * from ?`user_test` where uid=10 and name='識時務(wù)者' and phone='13047967256';? explain select * from ?`user_test` where name='識時務(wù)者' and phone='13047967256';? explain select * from ?`user_test` where name='識時務(wù)者';? explain select * from ?`user_test` where uid=10 and phone='13047967256';?
7.盡量使用inner join,避免left join:
如果連接方式是inner join,在沒有其他過濾條件的情況下MySQL會自動選擇小表作為驅(qū)動表,但是left join在驅(qū)動表的選擇上遵循的是左邊驅(qū)動右邊的原則,即left join左邊的表名為驅(qū)動表。
8.注意范圍查詢語句:
對于聯(lián)合索引來說,如果存在范圍查詢,比如between、>、<等條件時,會造成后面的索引字段失效。
解決辦法: 業(yè)務(wù)允許的情況下,使用 >= 或者<= 這樣不影響索引的使用
9.不建議使用%前綴模糊查詢:
例如 : LIKE“%name”或者LIKE“%name%”,這種查詢會導(dǎo)致索引失效而進(jìn)行全表掃描。但是可以使用LIKE “name%”。
10.在 where 子句中使用 or 來連接條件,如果or連接的條件有一方?jīng)]有索引,將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
解決辦法: 將or連接的雙方都建立索引,就可以使用
11.應(yīng)盡量避免在where子句中對字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
12.字符串類型的字段 查詢的時候如果不加引號’’ ,會導(dǎo)致自動進(jìn)行隱式轉(zhuǎn)換,然后索引失效
到此這篇關(guān)于SQL優(yōu)化的N種方法(小結(jié))的文章就介紹到這了,更多相關(guān)SQL 優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server統(tǒng)計信息更新時采樣百分比對數(shù)據(jù)預(yù)估準(zhǔn)確性的影響詳解
這篇文章主要給大家介紹了關(guān)于SQL Server統(tǒng)計信息更新時采樣百分比對數(shù)據(jù)預(yù)估準(zhǔn)確性影響的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09sqlserver存儲過程中SELECT 與 SET 對變量賦值的區(qū)別
SQLServer中對已經(jīng)定義的變量賦值的方式用兩種,分別是 SET 和 SELECT。對于這兩種方式的區(qū)別,SQL Server 聯(lián)機(jī)叢書中已經(jīng)有詳細(xì)的說明,但很多時候我們并沒有注意,其實(shí)這兩種方式還是有很多差別的。2011-04-04SQL Server 2000“設(shè)備激活錯誤”的解決方法
數(shù)據(jù)庫恢復(fù)時出現(xiàn)諸如“設(shè)備激活錯誤,請使用with move選項來標(biāo)志該文件的有效位置”報錯的解決方法2013-11-11SQL語句查詢數(shù)據(jù)庫中重復(fù)記錄的個數(shù)
一個sql語句:一個表test有四個字段id,a,b,c,如果表中的記錄有三個字段a,b,c都相等,則說明這條記錄是相同的,求相同的記錄的個數(shù) 。2009-11-11SQL Server遍歷表中記錄的2種方法(使用表變量和游標(biāo))
遍歷表一般都要用到游標(biāo)在SQL Server中可以很容易的用游標(biāo)實(shí)現(xiàn)循環(huán)實(shí)現(xiàn)遍歷表中記錄,本文將介紹使用表變量和游標(biāo)實(shí)現(xiàn)數(shù)據(jù)庫中表的遍歷,感興趣的朋友可以了解下本文,或許可以幫助到你2013-02-02sqlserver isnull在數(shù)據(jù)庫查詢中的應(yīng)用
isnull在數(shù)據(jù)庫查詢中的應(yīng)用,特別是再語句連接的時候需要用到2011-11-11