常見的SQL優化面試題


 

1.在表中建立索引,優先考慮where.group by使用到的字段。

2.查詢條件中,一定不要使用select *,因為會返回過多無用的字段會降低查詢效率。應該使用具體的字段代替*,只返回使用到的字段。

3.不要在where條件中使用左右兩邊都是%的like模糊查詢,如:

SELECT * FROM t_order WHERE customer LIKE '%zhang%'

這樣會導致數據庫引擎放棄索引進行全表掃描。

優化:盡量在字段后面使用模糊查詢。如下:

SELECT * FROM t_order WHERE customer LIKE 'zhang%'

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)

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.盡量不要在 where 子句中對字段進行表達式操作,這樣也會造成全表掃描。如:

select id FROM t_order where num/2=100

應改為:

select id FROM t_order where num=100*2

7.where條件里盡量不要進行null值的判斷,null的判斷也會造成全表掃描。如下:

SELECT * FROM t_order WHERE score IS NULL

優化:

給字段添加默認值,對默認值進行判斷。如:

SELECT * FROM t_order WHERE score = 0

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%'

9.盡量不要使用where 1=1的條件

有時候,在開發過程中,為了方便拼裝查詢條件,我們會加上該條件,這樣,會造成進行全表掃描。如下:

SELECT * FROM t_order WHERE 1=1

優化:

如果用代碼拼裝sql,則由代碼進行判斷,沒where加where,有where加and

如果用mybatis,請用mybatis的where語法。

10.程序要盡量避免大事務操作,提高系統並發能力。

11.一個表的索引數最好不要超過6個,如果索引太多的話,就需要考慮一下那些不常使用到的列上建的索引是否有必要。


免責聲明!

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



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