常見的SQL優化面試題
原文:https://www.csdn.net/tags/MtjaQg3sMDA0NDAtYmxvZwO0O0OO0O0O.html
現在面試過程中,除了開發的基礎,面試官通常還會問SQL優化的方面,SQL優化也能體現出來平時對資料庫的理解和技術的高低。現在就總結了幾個,希望對大家有幫助。
6.1.在表中建立索引,優先考慮where.group by使用到的欄位。
6.2.查詢條件中,一定不要使用select * ,因為會返回過多無用的欄位會降低查詢效率。應該使用具體的欄位代替,只返回使用到的欄位。
6.3.不要在where條件中使用左右兩邊都是%的like模糊查詢,如:
SELECT * FROM t_order WHERE customer LIKE '%zhang%'
這樣會導致資料庫引擎放棄索引進行全表掃描。
優化:儘量在欄位後面使用模糊查詢。如下:
SELECT * FROM t_order WHERE customer LIKE 'zhang%'
6.4.儘量不要使用in 和not in,會造成全表掃描。如下:
SELECT * FROM t_order WHERE id IN (2,3)
SELECT * FROM t_order1 WHERE customer IN (SELECT customer FROM t_order2)
優化:
對於連續的數值,能用 between 就不要用 in ,如下:SELECT * FROM t_order WHERE id BETWEEN 2 AND 3
對於子查詢,可以用exists代替。如下:SELECT * FROM t_order1 WHERE EXISTS (SELECT * FROM t_order2 WHERE t1.customer = t2.customer)
6.5.儘量不要使用or,會造成全表掃描。如下:
SELECT * FROM t_order WHERE id = 1 OR id = 3
優化:可以用union代替or。如下:
SELECT * FROM t_order WHERE id = 1
UNION
SELECT * FROM t_order WHERE id = 3
6.6.儘量不要在 where 子句中對欄位進行表示式操作,這樣也會造成全表掃描。如:
select id FROM t_order where num/2=100
應改為:
select id FROM t_order where num=100*2
6.7.where條件裡儘量不要進行null值的判斷,null的判斷也會造成全表掃描。如下:
SELECT * FROM t_order WHERE score IS NULL
優化:
給欄位新增預設值,對預設值進行判斷。如:
SELECT * FROM t_order WHERE score = 0
6.8.儘量不要在where條件中等號的左側進行表示式.函式操作,會導致全表掃描。如下:
SELECT * FROM t_order2 WHERE score/10 = 10
SELECT * FROM t_order2 WHERE SUBSTR(customer,1,5) = 'zhang'
優化:
將表示式.函式操作移動到等號右側。如下:
SELECT * FROM t_order2 WHERE score = 10*10
SELECT * FROM t_order2 WHERE customer LIKE 'zhang%'
6.9.儘量不要使用where 1=1的條件**
有時候,在開發過程中,為了方便拼裝查詢條件,我們會加上該條件,這樣,會造成進行全表掃描。如下:
SELECT * FROM t_order WHERE 1=1
優化:
如果用程式碼拼裝sql,則由程式碼進行判斷,沒where加where,有where加and
如果用mybatis,請用mybatis的where語法。
6.10.程式要儘量避免大事務操作,提高系統併發能力。
6.11.一個表的索引數最好不要超過6個,如果索引太多的話,就需要考慮一下那些不常使用到的列上建的索引是否有必要。