1. 程式人生 > >mysql處理海量資料時的一些優化查詢速度方法

mysql處理海量資料時的一些優化查詢速度方法

原文:http://www.itjhwd.com/4588798/

最近一段時間由於工作需要,開始關注針對Mysql資料庫的select查詢語句的相關優化方法。

由於在參與的實際專案中發現當mysql表的資料量達到百萬級時,普通SQL查詢效率呈直線下降,而且如果where中的查詢條件較多時,其查詢速度簡直無法容忍。曾經測試對一個包含400多萬條記錄(有索引)的表執行一條條件查詢,其查詢時間竟然高達40幾秒,相信這麼高的查詢延時,任何使用者都會抓狂。因此如何提高sql語句查詢效率,顯得十分重要。以下是網上流傳比較廣泛的30種SQL查詢語句優化方法:

1、應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

2、對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

3、應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

Java
12<code>select id fromtwhere num isnull</code>

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

Java
1 2 <code>select id
fromtwhere num=0 </code>

4、儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

Java
12<code>select id fromtwhere num=10ornum=20</code>

可以這樣查詢:

Java
1 2 3 4 <code>select id fromtwhere num=10 union all select
id fromtwhere num=20 </code>

5、下面的查詢也將導致全表掃描:(不能前置百分號)

Java
12<code>select id fromtwhere name like‘�c%</code>

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

6、in 和 not in 也要慎用,否則會導致全表掃描,如:

Java
1 2 <code>select id fromtwhere num in(1,2,3) </code>

對於連續的數值,能用 between 就不要用 in 了:

Java
12<code>select id fromtwhere num between1and3</code>

7、如果在 where 子句中使用引數,也會導致全表掃描。因為SQL只有在執行時才會解析區域性變數,但優化程式不能將訪問計劃的選擇推遲到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變