sql語句or的優化
1. sql優化問題 用到了or,怎麼對or進行優化
看具體的代碼,是怎麼個OR法。
1、不同的邏輯組合 -- 改為UNION,使查詢時各自採用恰當的Index
2、多個代碼匹配組合 -->改為IN(。。。)
2. 如何進行SQL性能優化
這里分享下mysql優化的幾種方法。
1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。
3. sql or 語句優化問題
試試這個:
SELECT * FROM get_childs1('1')
WHERE addorgid=childid
OR receiveorgid=childid
OR sendorgid=childid
OR adddeptid =childid
OR senddeptid =childid
OR receivedeptid=childid
改成:
SELECT * FROM get_childs1('1')
WHERE childid in(addorgid,receiveorgid,sendorgid,adddeptid,senddeptid,receivedeptid)
4. 請問SQL語句優化的策略都有哪些
●
創建表的時候。應盡量建立主鍵,根據主鍵查詢數據;
●
大數據表刪除,用truncate
table代替delete。
●
合理使用索引,在OLTP應用中一張表的索引不要太多。組合索引的列順序盡量與查詢條件列順序保持一致;對於數據操作頻繁的表,索引需要定期重建,以減少失效的索引和碎片。
●
查詢盡量用確定的列名,少用*號。
盡量少嵌套子查詢,這種查詢會消耗大量的CPU資源;對於有比較多
or運算的查詢,建議分成多個查詢,用union
all聯結起來;多表查詢
的查詢語句中,選擇最有效率的表名順序(基於規則的優化器中有效)。Oracle解析器對表解析從右到左,所以記錄少的表放在右邊。
●
盡量多用commit語句提交事務,可以及時釋放資源、解
鎖、釋放日誌空間、減少管理花費;在頻繁的、性能要求比較高的
數據操作中,盡量避免遠程訪問,如資料庫鏈等,訪問頻繁的表可以常駐內存:alter
table...cache;
5. 如何優化帶or條件的sql
可以把or條件換成 union,union 比or 本身要快很多。
另外根據需要增加條件列上的索引。
注意 union all 和union 的區別
6. sql優化的N種方法
1.SQL語句中IN包含的值不應過多:
例如:select id from t where num in(1,2,3) 對於連續的數值,能用between就不要用in了; 實測速度差距不是很大.
2.SELECT語句務必指明欄位名稱:
禁止用 * 來查詢 ,禁止用 * 來查詢 ,禁止用 * 來查詢 , 查找哪個欄位,就寫具體的欄位.
select * from user_test WHERE address=15988;
select address from user_test WHERE address=15988;
3.只查詢一條數據的時候,使用limit 1
【這個很有用】
4.避免在where子句中對欄位進行null值判斷:
【實測:null值的判斷依然走了索引】
explain select uid from user_test WHERE phone is null;
5.避免在where子句中對欄位進行表達式操作:
6.對於聯合索引來說,要遵守最左前綴法則:
例如組合索引(id,name,sex) 使用的時候,可以id 或者id,name . 禁止直接name,或者sex.會導致聯合索引失敗
注意: id, name,sex 這三個欄位填寫順序不會有影響, mysql會自動優化成最左匹配的順序.
前三條sql都能命中索引,中間兩條由於不符合最左匹配原則,索引失效.
最後一條sql 由於有最左索引id 所以索引部分成功,部分失效. id欄位索引使用成功.
7.盡量使用inner join,避免left join:
如果連接方式是inner join,在沒有其他過濾條件的情況下MySQL會自動選擇小表作為驅動表,但是left join在驅動表的選擇上遵循的是左邊驅動右邊的原則,即left join左邊的表名為驅動表。
【實測:不是很准確,具體用explain測試】
8.注意范圍查詢語句:
對於聯合索引來說,如果存在范圍查詢,比如between、>、<等條件時,會造成後面的索引欄位失效。
解決辦法: 業務允許的情況下,使用 >= 或者<= 這樣不影響索引的使用.
explain select * from user_test where uid=10 and name='張三' and phone='13527748096';
explain select * from user_test where uid between( 1 and 10) and name ='張三' and phone='13527748096';
9.不建議使用%前綴模糊查詢:
例如 : LIKE「%name」或者LIKE「%name%」,這種查詢會導致索引失效而進行全表掃描。但是可以使用LIKE 「name%」。
explain select * from user_test where uid=10 and uid like "%1" ;
explain select * from user_test where uid=10 and uid like "1%" ;
10.在 where 子句中使用 or 來連接條件,如果or連接的條件有一方沒有索引,將導致引擎放棄使用索引而進行全表掃描
解決辦法: 將or連接的雙方都建立索引,就可以使用.
explain select * from user_test where uid=10 or name='張三';
11.應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。(此處存在疑點,我本人測試的時候,發現索引還是能使用到)
12.字元串類型的欄位 查詢的時候如果不加引號'' ,會導致自動進行隱式轉換,然後索引失效
7. 如何優化帶or條件的sql
可以把or條件換成 union,union 比or 本身要快很多。 另外根據需要增加條件列上的索引。 注意 union all 和union 的區別
8. SQL語句的幾種優化方法
1、盡可能建立索引,包括條件列,連接列,外鍵列等。
2、盡可能讓where中的列順序與復合索引的列順序一致。
3、盡可能不要select *,而只列出自己需要的欄位列表。
4、盡可能減少子查詢的層數。
5、盡可能在子查詢中進行數據篩選 。
9. sql語句優化
1.查看鏈接查詢部分是不是鍵和索引
2.檢查d.area_id是不是有索引
3.檢查a.alloc_date是不是有索引
4.將Or鏈接的條件改成union all的方式來查詢
5.(可能是關鍵)to_char(a.alloc_date,'yyyymm')>='200805' 這個函數方式的,改為直接方式的a.alloc_date >= date'2008-05-01' 避免全表掃描
6.(也可能是關鍵)檢查類型一致性,area_id in d.area_id in (17000124,17000125,17000126,17000127) 這個就要求area_id 一定是數值的,否則很大幾率對area_id做轉換函數從而全表掃描的。如果是字元串的in後面的每一項就應該加上單引號。
7.經in語法改成or語法
8.如果還不行的話,根據表的大小情況做成嵌套查詢,以便強制條件的應用順序,以避免先連接再篩選的情況發生。
以上只是建議,具體的如果我猜的不錯的話用的是oracle,那麼在PL/SQL裡面將查詢部分摘出來,執行後按F5就可以看到解釋計劃窗口了,看看瓶頸在什麼地方
10. MySQL百萬級數據表or查詢優化
目前公司的訂單表有100多萬條,使用訂單號查詢數據時,所需時間大多要10-30秒不等,查看了慢查詢日誌,發現有的訂單查詢竟然耗時65秒
我查看了原有的查詢語句,發現where後面跟了or查詢,雖然3個or都索引,使用explain分析查詢結果,發現要掃描近70萬行,幾乎是全盤掃描一遍,只為獲取最多3條數據,效率實在是低下
這3個欄位均設置了索引,但or在這個語句中,使索引失效了(主要看最後幾行)
使用union all代替or查詢,也就是說把3個欄位的查詢分別做查詢,將結果使用union all連接在一起,這樣單次查詢可以用到索引,效率大大提高
先看一下分析結果
簡要的sql語句,查詢結果不超80ms