面試常問題目:在千萬級的資料庫查詢中,如何提高效率?

2020-12-17 像蝸牛一樣瘋狂編程

今天主要是和大家分享一下,如何進行資料庫查詢的優化。廢話不多說,直接開始咯。

在千萬級的資料庫查詢中,如何提高效率?我覺得要弄清楚這個問題,我們應該從兩方面入手。

資料庫設計方面

SQL 語句方面

一、資料庫設計方面

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

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

如: select id from t where num is null 可以在 num 上設置默認值 0,確保表中 num 列沒有 null 值,然後這樣查

詢: select id from t where num=0

c. 並不是所有索引對查詢都有效,SQL 是根據表中數據來進行查詢優化的,當索引列有大量數據重複時,查詢可能不會去利用索引,如一表中有欄位 sex,male、female 幾乎各一半,那麼即使在 sex 上建了索引也對查詢效率起不了作用。

d. 索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過 6 個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

e. 應儘可能地避免更新索引數據列,因為索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新索引數據列,那麼需要考慮是否應將該索引建為索引。

f. 儘量使用數字型欄位,若只含數值信息的欄位儘量不要設計為字符型,這會降低查詢和連接的性能,並會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對於數字型而言只需要比較一次就夠了。

g. 儘可能地使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位存儲空間小,可以節省存儲空間,

h. 儘量使用表變量來代替臨時表。如果表變量包含大量數據,請注意索引非常有限(只有主鍵索引)。

i. 避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

j. 臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個數據集時。但是,對於一次性事件,最好使用導出表。

k. 在新建臨時表時,如果一次性插入數據量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先 create table,然後 insert。

l. 如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 droptable ,這樣可以避免系統表的較長時間鎖定。

二、SQL 語句方面

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

b. 應儘量避免在 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

c. 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

d. 下面的查詢也將導致全表掃描: select id from t where name like 『%abc%』

e. 如果在 where 子句中使用參數,也會導致全表掃描。因為 SQL 只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。

然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描: select id from t wherenum=@num

可以改為強制查詢使用索引: select id from t with(index(索引名)) where num=@num

f. 應儘量避免在 where 子句中對欄位進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2=100 應改為: select id from t where num=100*2

g. 應儘量避免在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′

h. 不要在 where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

i. 不要寫一些沒有意義的查詢,如需要生成一個空表結構: select col1,col2 into #t from t where 1=0 這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣: create table #t(…)

j. 很多時候用 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)

k. 任何地方都不要使用 select * from t ,用具體的欄位列表代替「*」,不要返回用不到的任何欄位。

l. 儘量避免使用遊標,因為遊標的效率較差,如果遊標操作的數據超過 1 萬行,那麼就應該考慮改寫。

m. 儘量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

n. 儘量避免大事務操作,提高系統並發能力。

最後補充一些 有關java 方面

a.儘可能的少造對象。

b.合理擺正系統設計的位置。大量數據操作,和少量數據操作一定是分開的。大量的數據操作,肯定不是 ORM框架搞定的。,

c.使用 jDBC 連結資料庫操作數據

d.控制好內存,讓數據流起來,而不是全部讀到內存再處理,而是邊讀取邊處理;

e.合理利用內存,有的數據要緩存

相關焦點

  • 直擊資料庫面試題:資料庫查詢語句
    SQL查詢的題目,查詢A(ID,Name)表中第31至40條記錄,ID作為主鍵可能是不是連續增長的列,完整的查詢語句如下: 方法一: select top 10 * from A where ID >(select max(ID) from (select
  • 計算機考研複試面試常問問題 資料庫篇
    計算機考研複試面試常問問題 資料庫篇在複習過程中,我用心查閱並整理了在考研複試面試中可能問到的大部分問題,並分點整理了答案,可以直接理解背誦並加上自己的語言潤色!極力推薦列印下來看,效率更高!絕對良心之作!
  • 千萬級MySQL資料庫這樣建索引可以讓你的資料庫飛起來
    總的來說,小型表肯定不建索引,或者資料庫記錄在億條數據級以上,還是建議使用非關係型資料庫。對千萬級MySQL資料庫建立索引的事項及提高性能的手段注意事項:首先,應當考慮表空間和磁碟空間是否足夠。MySql在索引優化時需要注意的問題設計好MySql的索引可以讓你的資料庫飛起來,大大的提高資料庫效率。創建索引:對於查詢佔主要的應用來說,索引顯得尤為重要。
  • 教師面試常問問題
    廣東教師招聘網提供以下教師面試信息:教師面試常問問題,更多關於教師面試,結構化題目,教師面試的內容,請關注廣東教師招聘網/廣東人事考試網!   教師面試常問問題   1.問題:當在你上課時,一個學生在傳紙條,你怎麼辦?   1、 用眼神暗示他,引起他的bai注意,讓他聚精會神的聽課。2、 邊講課邊走到他的課桌邊,用手敲打他的書桌,提示他,讓他聚精會神的聽課。
  • 「MySQL系列」分析Sql執行時間及查詢執行計劃(附資料庫和一千萬數據)
    我們幹開發面試工作的時候,發現對資料庫的面試比重很大。說明對資料庫的知識掌握對我們程式設計師越來越重要了。接下來這篇文章我們來看看如何分析我們的sql執行效率。首先找到執行慢的sql,然後對執行慢的SQL進行分析。
  • 結構化面試:教師面試常問問題
    廣東教師招聘網提供以下教師備考資料信息:結構化面試:教師面試常問問題,更多關於教師面試,結構化題目,教師備考資料的內容,請關注廣東教師招聘網/廣東人事考試網!
  • 面試被問:JDBC底層是如何連接資料庫的?
    背景前兩天一個小夥伴面試的時候,被問JDBC底層是如何連接資料庫的?他頓時一臉懵逼,因為大部分人只知道JDBC的幾個步驟,至於底層到底是怎麼連接資料庫的,還真不知道。由於小夥伴是面試高級開發,問這種問題倒也不能說面試官過分,如果是初級或者中級,那問著問題就確實有些過分了。
  • 睿帆科技:千億級數據毫秒響應的雪球資料庫
    為了幫助企業做到穩、準、快的實現海量數據的調用需求,掌握PB級數據核心處理技術的大數據產品及解決方案供應商睿帆科技,在原有的零距大數據中臺的基礎上,自研了一款具有千億級數據毫秒查詢速度的分布式分析型資料庫雪球DB。「雪球」的特點主要在於列式存儲,向量化執行引擎,高可靠的集群架構以及數據自動均衡、實現副本異步拷貝的能力。
  • 教你快速掌握資料庫查詢優化的實用技巧
    資料庫查詢優化的實用技巧: 本文中,abigale代表查詢字符串,ada代表數據表名,alice代表欄位名。 技巧一: 問題類型:ACCESS資料庫欄位中含有日文片假名或其它不明字符時查詢會提示內存溢出。
  • 吊打面試官?2020 年資料庫高頻面試題|原力計劃
    使用B樹的好處B樹可以在內部節點同時存儲鍵和值,因此,把頻繁訪問的數據放在靠近根節點的地方將會大大提高熱點數據的查詢效率。這種特性使得B樹在特定數據重複多次查詢的場景中更加高效。而在B+樹中,順序檢索比較明顯,隨機檢索時,任何關鍵字的查找都必須走一條從根節點到葉節點的路,所有關鍵字的查找路徑長度相同,導致每一個關鍵字的查詢效率相當。4、B-樹在提高了磁碟IO性能的同時並沒有解決元素遍歷的效率低下的問題。B+樹的葉子節點使用指針順序連接在一起,只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而B樹不支持這樣的操作。
  • 如何優化MySQL千萬級大表,我寫了6000字的深度解讀
    這是學習筆記的第 2138 篇文章千萬級大表如何優化,這是一個很有技術含量的問題,通常我們的直覺思維都會跳轉到拆分或者數據分區,在此我想做一些補充和梳理,想和大家做一些這方面的經驗總結,也歡迎大家提出建議。
  • 面試官常問的三個問題
    不管是職場新人,還是老人去面試 在HR處常問的三個問題: 1、請簡要介紹一下你自己 2、什麼事讓你最有成就感 考察你的業績,處理問題的能力,以及心態 這裡講一個自己成功的故事,時間,地點,人物,發生了什麼事,遇到了什麼困難,你是如何努力達成的。
  • 實操手冊:如何玩轉跨庫Join?跨資料庫實例查詢應用實踐
    一、背景隨著業務複雜程度的提高、數據規模的增長,越來越多的公司選擇對其在線業務資料庫進行垂直或水平拆分,甚至選擇不同的資料庫類型以滿足其業務需求。原本在同一資料庫實例裡就能實現的SQL查詢,現在需要跨多個資料庫實例才能完成。
  • 如何做好面試題目準備,將面試成功率提高80%
    如何分工?你在上家公司的崗位職責有哪些?判斷簡歷真實度、與我司崗位職責符合度你的主要工作成果或業績有哪些?請舉例說明。任務是主導還是參與執行?完成周期?數據化的結果?素質項主動性你前任工作中,都幹了哪些有助於你提高工作創造性的事情?
  • Oracle資料庫面試知識點複習
    從表中提取查詢數據.語法為SELECT [DISTINCT] {column1,column2,…} FROM tablename WHERE {conditions} GROUP BY {conditions} ORDER BY {expressions} [ASC/DESC]; 說明:SELECT子句用於指定檢索資料庫的中哪些列,FROM
  • 面試中常問的 14道計算機網絡 題目
    原理:DNS解析主要有遞歸查詢,就是在某個DNS伺服器緩存中查找不到相應的域名與IP位址對應關係時,自動跳轉到到下一步驟通過下一個DNS伺服器進行查找。過程:瀏覽器緩存當用戶通過瀏覽器訪問某域名時,首先識別URL中協議,域名,文件路徑,埠等信息。
  • 【DB筆試面試538】在Oracle中, 資料庫的參數分為哪幾類?
    題目部分在Oracle中, 資料庫的參數分為哪幾類?答案部分Oracle資料庫根據SPFILE或PFILE中設置的參數來啟動資料庫。該類參數在官方文檔中的「Default value」中由關鍵字Derived標識,例如,DML_LOCKS參數的默認值為:Derived: 4 * TRANSACTIONS,說明該參數為推導參數,它的值默認為參數TRANSACTIONS值的4倍。如何判斷一個初始化參數的值是否是默認參數值?
  • SQL面試常考題有哪些?
    數據分析都是以數據為基礎的,要想進行分析,首先要把數據從資料庫中提取出來;而SQL又是最常用的資料庫查詢語言,所以,不考才怪‍️。 SQL面試考核的內容和範圍有哪些?需要注意的是,在最近的面試中,有的公司第一輪的HR面試也開始考察SQL的基礎概念了,可能是因為競爭越來越激烈了,公司想在第一輪提高篩選的效率。題一般不會很難,但是建議同學們心中有數,不要遇到這種情況的時候突然懵掉。
  • 挖掘未來「鑽石礦」,睿帆科技如何用好資料庫這把利器?
    此外,人工智慧、數據中臺等新技術新概念的興起,也推送了大數據產業的轉型和融合。目前,行業頭部企業數據每年以PB級甚至上百PB爆炸式增長,催生了對於PB級數據量在線或實時數據分析的處理能力的需求。如何存儲,使用這些數據,成為SAAS賽道上,各個大數據服務商需要深思的問題。
  • 面試問題及答案:面試官最常問的25個問題
    在參加面試時如果不做好提前準備可能會由於過於緊張而錯失好機會,提前了解面試內容十分重要。下面是整理的面試官最常問的25個問題,歡迎閱讀。  面試官最常問的25個問題  面試前要做好哪些準備:  1、了解公司的業務模式。  2、儘可能理解你要面試的職位是幹什麼的?需要你具備哪些能力?