1. 程式人生 > >資料庫查詢優化 查詢上百萬級記錄提高查詢速度

資料庫查詢優化 查詢上百萬級記錄提高查詢速度

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:
select id from t where num=0
3.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
4.應儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'

若要提高效率,可以考慮全文檢索。
7. 如果在 where 子句中使用引數,也會導致全表掃描。因為SQL只有在執行時才會解析區域性變數,但優化程式不能將訪問計劃的選擇推遲到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計劃,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where [email protected]
可以改為強制查詢使用索引:
select id from t with(index(索引名)) where [email protected]
8.應儘量避免在 where 子句中對欄位進行表示式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2=100
應改為: 
select id from t where num=100*2
9.應儘量避免在where子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
應改為:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。
11.在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應儘可能的讓欄位順序與索引順序相一致。
12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類程式碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)
13.很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)
14.並不是所有索引對查詢都有效,SQL是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引,如一表中有欄位sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
15. 索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。
16.應儘可能的避免更新 clustered 索引資料列,因為 clustered 索引資料列的順序就是表記錄的物理儲存順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引資料列,那麼需要考慮是否應將該索引建為 clustered 索引。
17.儘量使用數字型欄位,若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線時會逐個比較字串中每一個字元,而對於數字型而言只需要比較一次就夠了。
18.儘可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位儲存空間小,可以節省儲存空間,其次對於查詢來說,在一個相對較小的欄位內搜尋效率顯然要高些。
19.任何地方都不要使用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位。
20.儘量使用表變數來代替臨時表。如果表變數包含大量資料,請注意索引非常有限(只有主鍵索引)。
21.避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。
22.臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個資料集時。但是,對於一次性事件,最好使用匯出表。
23.在新建臨時表時,如果一次性插入資料量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後insert。
24.如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table ,這樣可以避免系統表的較長時間鎖定。
25.儘量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過1萬行,那麼就應該考慮改寫。
26.使用基於遊標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。
27. 與臨時表一樣,遊標並不是不可使用。對小型資料集使用 FAST_FORWARD 遊標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括“合計”的例程通常要比使用遊標執行的速度快。如果開發時 間允許,基於遊標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。
28.在所有的儲存過程和觸發器的開始處設定 SET NOCOUNT ON ,在結束時設定 SET NOCOUNT OFF 。無需在執行儲存過程和觸發器的每個語句後向客戶端傳送 DONE_IN_PROC 訊息。
29.儘量避免大事務操作,提高系統併發能力。
30.儘量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理。

相關推薦

資料庫查詢優化 查詢百萬記錄提高查詢速度

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num is null可以在num上設定預設

Oracle資料庫查詢優化方案(處理百萬記錄如何提高處理查詢速度

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num is null可以在num上設定預設

【轉載】mysql 百萬記錄查詢優化方案

 1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。   2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:   select id from t w

SQL Server 百萬資料提高查詢速度的方法

1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 3.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎

MySql查詢優化 百萬記錄查詢優化 limit分頁查詢

效率分析關鍵詞:explain + SQL語句 一,最常見MYSQL最基本的分頁方式limit: select * from `table` order by id desc limit 0, 20在中小資料量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用

MySQL 億資料需求的優化思路(一),交易流水記錄查詢

對MySQL的效能和億級資料的處理方法思考,以及分庫分表到底該如何做,在什麼場景比較合適? 比如銀行交易流水記錄的查詢  限鹽少許,上實際實驗過程,以下是在實驗的過程中做一些操作,以及踩過的一些坑,我覺得坑對於讀者來講是非常有用的。 首先:建立一個現金流量表,交易歷史是各個金融

Oracle資料庫--解決單張表中資料量巨大(大資料、資料量百萬級別,後查詢,更新資料等耗時劇增)

思路1:採用備份表 備份表中儲存不活躍的資料eg:只有查詢操作的資料(資料的部分屬性欄位不再更改)且查詢次數也較少; 備份表可以是一張或者多張備份表,若採用多張備份表,則定期建立備份表(備份表的命名要規範,可以考慮使用原表名稱+時間戳命名) 採用多張備份表:定期建立一個備份

資料庫查詢優化技術(二):子查詢優化

查詢的基本操作     1選擇操作 對應的是限制條件(格式類似“field<op>consant”, field表示列物件,op是操作符如"="、">"等)。 操作物件是二維表中的行 優化方式: 選擇操作下推 目的: 是儘

Postgre查詢優化器--篇 原理解析

本章節將從原始碼的角度來分析PG優化器的原理,工作方式,本文大部分內容來自 李海翔 《資料庫優化器的藝術》 PG的查詢執行過程 從表象來分析PG的查詢執行過程,從而深入理解架構層次,從PG的查詢執行過程分為4個階段,跟mysql的過程有點類似 語法分析階段,語義分析階段,優化階段,這

百萬資料導致查詢緩慢的問題解決方式-給SQL 新增索引

本文參考自: https://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167795.html https://www.cnblogs.com/replace/archive/2006/04/10/371067.html –原查詢語句

資料庫調優教程(三)記錄查詢

一、           發現慢查詢 上一講我們為慢查詢的發生做了資料準備,這一講就讓我們來發現慢查詢,同時把它記錄到檔案中。 3.      記錄慢查詢 此時我們已經有讓慢查詢發生的成本了。

【JAVAEE學習筆記】hibernate04:查詢種類、HQL、Criteria、查詢優化和練習為客戶列表增加查詢條件

沒有 arrays getpara tex response 寫法 sum exceptio 提高 一、查詢種類 1.oid查詢-get 2.對象屬性導航查詢 3.HQL 4.Criteria 5.原生SQL 二、查詢-HQL語法 //學習HQL語法 public

效能優化實戰:百萬WebSockets和Go語言

SegmentFault 首頁 問答 專欄 講堂 發現 搜尋 立即登入免費註冊

SQL優化,處理百萬以上的資料處理

處理百萬級以上的資料提高查詢速度的方法:  1.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。  2.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  3.應儘量避免在 where 子

SQL 百萬級數據提高查詢速度的方法

需求 可能 有效 分區 值轉換 導致 das lock 改善 SQL 百萬級數據提高查詢速度的方法 1.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應盡量避免全表掃描,首先應考慮在

MySQL百萬資料庫查詢優化技巧

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: select id from t where nu

百萬資料庫記錄下的Mysql快速分頁優化例項

百萬級資料庫記錄下的Mysql快速分頁優化例項   MySql 效能到底能有多高?用了php半年多,真正如此深入的去思考這個問題還是從前天開始。有過痛苦有過絕望,到現在充滿信心!MySql 這個資料庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小

php 處理百萬條的資料庫如何提高處理查詢速度

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: select id from t where num

如何解決百萬資料查詢優化

一、SQL優化——使用索引查詢 造成全表查詢的(索引失效的情況):避免null值查詢。索引列的資料不要大量重複。where語句中or(union替代)、in not in(between and)

處理百萬以上數據提高查詢速度的方法

pro 需要 存儲空間 and 包括 col sql查詢 意義 調整 1.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 2.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的