對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引
前提:表資料很多
索引失效情況:
1:避免在索引列上使用計算。where子句中,如果索引列是函式的一部分。優化器將不使用索引而使用全表掃瞄。
低效: select … from employee where sal * 12 > 25000;
高效: select … from employee where sal > 25000/12
2:避免在索引列上使用is null和is not null:
對於單列索引,如果列包含空值,索引中將不存在此記錄
低效: (索引失效)
select … from department where dept_code is not null;
高效:(索引有效)
select … from department where dept_code >=0
記住, 索引只能告訴你什麼存在於表中, 而不能告訴你什麼不存在於表中。
3:應盡量避免在 where 子句中使用!=或<>操作符
否則將引擎放棄使用索引而進行全表掃瞄。
mysql只有對以下操作符才使用索引:<,<=,=,>,>=,between,以及某些時候的like。
可以在like操作中使用索引的情形是指另乙個運算元不是以萬用字元(%或者_)開頭的情形。例如:
select id from t where col like 'mich%'; # 這個查詢將使用索引,
select id from t where col like '%ike'; #這個查詢不會使用索引。
4:應盡量避免在 where 子句中使用 or 來連線條件否則將導致引擎放棄使用索引而進行全表掃瞄,如:
select id from t where num=10 or num=20
可以 使用union合併查詢: select id from t where num=10 union all select id from t where num=20
5:in 和 not in 也要慎用,否則會導致全表掃瞄,
如:select id from t where num in(1,2,3)對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
索引並不是越多越好,
所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
select子句中避免使用『*』:
在解析的過程中, 會將『*』依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間。
oracle 中sql優化的幾種方法
最基本最簡單的方式是減少訪問資料庫的次數。oracle在內部執行了許多任務作,比如解析sql語句,估算索引的利用率,讀資料塊等等,都將大量耗費oracle資料庫的執行。選擇最有效率的表名順序,也將明顯提公升oracle的效能。oracle解析器是按照從右到左的順序處理from子句中的表名。在執行se...
優化SQL的幾種方式
優化的目的 1 盡量保證索引能正確使用。2 盡量避免全域性搜尋。3 索引不是越多越好。方式 1 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引 2 應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全...
sql優化的幾種方式
一.為什麼要進行sql優化 我們開發專案上線初期,由於業務資料量相對較少,一些sql的執行效率對程式執行效率的影響不太明顯,而開發和運維人員也無法判斷sql對程式的執行效率有多大,故很少針對sql進行專門的優化,而隨著時間的積累,業務資料量的增多,sql的執行效率對程式的執行效率的影響逐漸增大,此時...