sql語句優化


SQL語句沒寫好可能導致:

1)網速不給力,不穩定。

2)服務器內存不夠,或者SQL 被分配的內存不夠。

3)sql語句設計不合理

4)沒有相應的索引,索引不合理

5)沒有有效的索引視圖

6)表數據過大沒有有效的分區設計

7)數據庫設計太2,存在大量的數據冗余

8)索引列上缺少相應的統計信息,或者統計信息過期

 

那么怎么對SQL進行優化呢?

1.不查詢多余的行與列

 盡量不要使用 select  * 去查詢,應該使用具體的那一列代替 * ,避免多余不需要使用的列。

   使用where條件判斷具體要查詢的數據避免查詢出多余的列。

   使用distinct關鍵詞避免重復的列。

2.謹慎使用distinct關鍵字

 distinct在查詢一個字段或者很少字段的情況下使用,會避免重復數據的出現,給查詢帶來優化效果。

   但是查詢字段很多的情況下使用,則會大大降低查詢效率。

3.連接查詢的優化

 首先你要弄明白你想要的數據是什么樣子的,然后再做出決定使用哪一種連接,這很重要。

 各種連接的取值大小為:

          內連接結果集大小取決於左右表滿足條件的數量

    左連接取決與左表大小,右相反。

         完全連接和交叉連接取決與左右兩個表的數據總數量

4.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

 select id from t where num is null    --可以在num這個列上給個默認約束等於0 然后 num = 0

5.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

 select id from t where num=10 or num=20  --這種不就是相當於是個in嗎? in不就是不走引索的嗎
   #可以這樣查詢:
   select id from t where num=10
   union all
   select id from t where num=20

 

 6.模糊搜索

select id from t where name like '%abc%'  --也將導致全表掃描

  '%abc' 這種也將導致全表掃描,盡量使用 'abc%' ---后通配 走索引 前通配 走全表。

  若要提高效率,可以考慮全文檢索。

7.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

8.很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(select num from b)
  用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)

9.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

10.不使用子查詢

SELECT * FROM t1 WHERE id in(SELECT id FROM t2 WHERE name='SimpleWu');--避免使用

子查詢在MySQL5.5版本里,內部執行計划器是這樣執行的:先查外表再匹配內表,而不是先查內表t2,當外表的數據很大時,查詢速度會非常慢。
在MariaDB10/MySQL5.6版本里,采用join關聯方式對其進行了優化,這條SQL會自動轉換為

SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id where t2.name="SimpleWu";

11. !=或者<>(不等於),可能導致不走索引,也可能走 INDEX FAST FULL SCAN

不知道SQL語句是否走引索?可以這樣

EXPLAIN  SELECT * FROM cnblogs_blog WHERE bno = 1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM