1. 索引sql
a. SQL語句的 where 和 join 部分中用到的字段,都應該加上索引。優化
b. 儘可能用加索引的字段進行直接判斷,不要對加索引的字段進行轉化後再判斷,由於這樣會致使加的索引無效,達不到優化的效果。blog
e.g. 查詢A表中全部2016年的數據索引
CREATE INDEX A_idx ON A (date_column); SELECT text, date_column FROM A WHERE TO_CHAR(date_column, 'YYYY') = '2016';
上述的索引 date_column並無生效,這個查詢能夠改成比較 date_column 的範圍。字符串
SELECT text, date_column FROM A WHERE date_column >= TO_DATE('2016-01-01', 'YYYY-MM-DD') AND date_column < TO_DATE('2016-01-01', 'YYYY-MM-DD');
c. 創建的索引,儘量的 cover 你的 SQL 語句。class
e.g. 下面2個查詢語句都用了A表中的b字段效率
CREATE INDEX A_idx ON A (a, b); SELECT id, a, b FROM A WHERE a = :a AND b = :b; SELECT id, a, b FROM A WHERE b = :b;
索引 cover 了第一個 select 語句,可是第二個 SQL 語句並無最大程度的利用索引。能夠對索引進行修改以達到最大利用的效果。date
CREATE INDEX A_idx ON A(b, a);
d. 加索引的字段,若是進行了 like 通配符過濾某些字符串,這時候的索引是無效的。
select
CREATE INDEX A_idx ON A (text); SELECT id, text FROM A WHERE text LIKE '%TERM%';
注意: 若是整個查詢全部引用的列都包含在索引中,那麼這個查詢就不須要直接訪問表,查詢速度就會提升。sql語句
2. 移除不須要的表和字段
不要將不須要的字段返回 SQL 客戶端。
不要在SQL語句查詢不須要的表。
3. 移除外部連接
4. 儘可能不要對字段進行轉換後再比較。
直接用原有字段查詢比轉換後再查詢的效率高。好比本文第一個查詢2016年數據的sql語句。