優化SQL的執行速度

在項目開發中,頁面的反應速度是很是重要的,改善頁面反應速度的方法有不少。web

但通常的問題多數是出如今數據庫訪問的SQL上面。sql

好比:重複屢次訪問數據庫,SQL速度很低等。數據庫

重複屢次訪問數據庫須要修改邏輯來減小數據庫的訪問。而SQL的執行速度能夠經過仔細調試解決。網絡

下面是一些SQL的性能調試方法.整理於網絡內容。app

1. IN和EXISTS函數

--1.慢  
SELECT  name  
FROM    Personnel  
WHERE   birthday IN (SELECT  birthday  
                       FROM     Celebrities);  
  
--2.快  
SELECT  P.name  
FROM    Personnel AS P  
WHERE   EXISTS   (SELECT  
                  FROM Clelebrities AS C  
                  WHERE P.birthday = C.birthday);

    其中EXISTS (SELECT * FROM …)的寫法比EXISTS (SELECT 列名 FROM …)的寫法好。
性能

2.  COUNT(*) 和 COUNT(列名)spa

  COUNT(列名)較快.net

3. GROUP BY 使用index。調試

   GROUP BY col1 若是不能使用index。 GROUP BY col1,col2可以使用index的話,改成 GROUP BY col1,col2。

4. ORDER BY 使用index。

  和GROUP BY同理。

5. UNION、INTERSECT、EXCEPT 後面加上ALL 關鍵字

  若是對重複數據不是很敏感的時候,在UNION、INTERSECT、EXCEPT 後面加上ALL 關鍵字後,性能會獲得提高。

6. 下面的一些寫法也會形成使用了index。

/* 1.index的col_1列有運算 */  
SELECT *   
  FROM SomeTable  
 WHERE col_1 * 1.1 > 100;

這種狀況改成 WHERE col_1  > 100/1.1便可。

  1. WHERE  col_1 IS NULL;

使用了is null的時候也是使用不了index的。這個時候能夠作個函數index來解決。

  1. WHERE  SUBSTR(col_1, 1, 1) = 'a';

index的列使用了函數。這個時候能夠作個函數index來解決。

  1. WHERE  col_1 <> 100;

使用了否認形式。 (<>, !=,NOT EQUAL, NOT IN)也是同樣的。

好比經過 col_1 < 100 OR col_1 > 100這種變換的形式來解決。

  1. WHERE  col_1 > 100  OR col_2 = 'abc';

OR的時候最好改成in。 若是非要使用OR的話,追加bitmap index。

&times; SELECT  *   FROM  SomeTable  WHERE  col_1  LIKE '%a';  
&times; SELECT  *   FROM  SomeTable  WHERE  col_1  LIKE '%a%';  
○ SELECT  *   FROM  SomeTable  WHERE  col_1  LIKE 'a%';

Like的時候,只有前方一致可以使用index。

後方一致能夠經過REVERSE轉換後,改成前方一致就能夠了。部分一致能夠寫個函數,追加函數index就能夠了。

SELECT * FROM SomeTable WHERE col_1 = 10;  
SELECT * FROM SomeTable WHERE col_1 = '10';  
SELECT * FROM SomeTable WHERE col_1 = CAST(10, AS CHAR(2));

col_1爲char類型,類型不匹配的時候,不能使用index。改成類型一致。

○ SELECT * FROM SomeTable WHERE col_1 = 10 AND col_2 = 100 AND col_3 = 500;  
○ SELECT * FROM SomeTable WHERE col_1 = 10 AND col_2 = 100 ;  
&times; SELECT * FROM SomeTable WHERE col_1 = 10 AND col_3 = 500 ;  
&times; SELECT * FROM SomeTable WHERE col_2 = 100 AND col_3 = 500 ;  
&times; SELECT * FROM SomeTable WHERE col_2 = 100 AND col_1 = 10 ;

假設col_1, col_2, col_3 列上有index,若是順序不對的話不能使用index。

  1. rowid(Oracle)、oid(PostgreSQL)若是知道行號的話,行號訪問最快。  

&times; SELECT * FROM SomeTable;  
○ SELECT col_1, col_2, col_3 FROM SomeTable;

最好只取須要的數據。這樣能夠減小零時表的大小,也能減小網絡的通訊量。

相關文章
相關標籤/搜索