1. 程式人生 > 其它 >SQL語句優化個人總結

SQL語句優化個人總結

1.避免SELECT *
SELECT中每少提取一個欄位,資料的提取速度就會有相應的提升。提升的速度還要看捨棄的欄位的大小來判斷。
2.建立索引
根據自己的需求適當建立索引,單個索引或聯合索引。mysql建立聯合索引的時候需要注意:有一個最左原則。
3.避免在列上運算,這樣會導致索引失效
SELECT usercode,username,age FROM t WHERE score/10 = 9;
優化為
SELECT usercode,username,age FROM t WHERE score = 9*10;
4.使用 JOIN 時
應該用小結果集驅動大結果集,同時把複雜的 JOIN 查詢拆分成多個query,因為 JOIN 多個表,可能導致更多的鎖定和堵塞。可以用join代替複雜的子查詢。


5.使用 LIKE 時
避免使用全模糊即'%%'查詢,這樣會進行全表掃描,不走索引。
SELECT usercode,username,age,score FROM t WHERE username LIKE '%王%';
優化為
SELECT usercode,username,age,score FROM t WHERE username LIKE '王%';
6.避免進行null值的判斷
null值判斷不走索引
SELECT usercode,username,age FROM t WHERE score IS NULL;
優化方式:可以給欄位新增預設值0,對0值進行判斷。如下:

SELECT usercode,username,age FROM t WHERE score = 0;


7.避免使用or
or 會進行全表掃描
SELECT id,username,age,score FROM t WHERE id = 1 OR usercode = '001';
優化方式:可以用union代替or。如下:
SELECT id,username,age,score FROM t WHERE id = 1
UNION
SELECT id,username,age,score FROM t WHERE usercode = '001';
8.避免使用in 和not in
SELECT usercode,username,age,score FROM t WHERE id IN (2,3);
SELECT usercode,username,age,score FROM t WHERE username IN (SELECT username FROM t1);

優化方式:如果是連續數值,可以用between代替。如下:
SELECT usercode,username,age,score FROM t WHERE id BETWEEN 2 AND 3;
如果是子查詢,可以用exists代替。如下:
SELECT usercode,username,age,score FROM t WHERE EXISTS (SELECT * FROM t1 WHERE t.username = t1.username);
9.LIMIT
limit的基數比較大時,使用 between,between 限定比 limit 快,但是between也有缺陷,如果id中間有斷行或是中間部分id不讀取的情況,資料會少
select usercode,username,age,score from t where score=100 limit 100000,10;
優化為
select usercode,username,age,score from t where score=100 between 100000 and 100010;
10.慢sql調優
找到慢sql慢的原因,是什麼引起慢的。可能是查詢條件沒有索引,或者查詢出來的資料量太大。
1.查詢條件沒有索引
根據查詢條件選擇最好的索引欄位建立索引。即這個欄位的值比較分散相對不集中,且這個欄位不能有null值,因為欄位值集中列舉較少可能資料庫引擎不會走索引;索引欄位null 值,就不會走索引,會全表掃描。
2.資料量太大
如果是查詢出來的資料量太大。導致某一個條件的值查詢出來的資料量很多,佔了整張表資料量的很大一部分。這就需要對資料進行分析,看看能不能通過查詢的必選條件建立索引去除很大一部分資料,或者通過某幾個條件可以去除大量資料,然後對這幾個條件建立聯合索引。