1. 程式人生 > >記錄一個sql優化後大大提高查詢效率的情形

記錄一個sql優化後大大提高查詢效率的情形

眾所周知,sql寫得怎麼樣,對於查詢效率的影響是頗大的。下面看一個比較普通的查詢:

假設一張表有event_date和event_time2個欄位分別表示日期和時間,現在直接給你一個時間字串,這個時間字串是“日期+時間”的組合,現在需要按時間範圍過濾出一部分資料。如果你不轉彎的話,很有可能你會按照慣性思維使用concat(event_date, event_time)連線函式,如:

SELECT A, MAX(B) AS B,SUBSTR(CONCAT(event_date, event_time),1,12)AS tran_time 
       FROM tablename 
            WHERE SUBSTR(CONCAT(event_date, event_time),1,12) >= :start_time  
            AND SUBSTR(CONCAT(event_date, event_time),1,12) < :end_time  
     AND A = :A  	
        GROUP BY A,tran_time  
        ORDER BY A,tran_time ASC

 start_time和end_time是傳遞過來的由“日期+時間”組合成的字串。

這是比較容易想到的傳統思維,但這種sql語句的查詢效率老低了。差不多查一次需要4.5s+, 因為不僅僅需要用到max函式,還需按SUBSTR(CONCAT(event_date, event_time),1,12) 這個計算出來的欄位group by,最主要的是在where語句裡,對2個時間的欄位需要進行多重函式運算後看看那些記錄符合你所規定的時間範圍~~  這樣,在不知不覺中,造成了全表掃描,效率極低,特別是在表中資料量比較大的時候。

我們已經知道,如果一張表是資料量比較大的表,並且一般都用與於查詢時,索引的使用會給我們帶來極大的效能優化。考慮到使用索引,我們應該儘量避免where語句裡的欄位不進行函式作用(因為即使你對where下的欄位建立了索引,但如果你對他們進行了函式運算,索引是失效的),所以我們考慮把它們儘量獨立開來。

基於上述思想,改正如下:

先對A, evnet_date和event_time三個欄位建立索引。

SELECT A, MAX(B) AS B,SUBSTR(CONCAT(event_date, event_time),1,12)AS tran_time 
       FROM tablename  
            WHERE event_date >= :start_date AND event_time >= :start_time  
       AND event_date <= :end_date AND event_time < :end_time   
     AND A = :A  	
        GROUP BY A,tran_time  
        ORDER BY A,tran_time ASC

 可以看出我們把event_date和event_time的起止時間都“拆”開來了,所以只需在傳過來的起止時間字串上擷取響應的日期和時間字串給sql語句即可。

測試檢查發現,2句sql查詢出的結果是一致的,說明他們是等效的。

改正之後,發現效率提升至0.05s左右,效能得到極大提升!!!

這句優化後的sql語句是突破了sql語句欄位去適應外部傳過來的時間字串,而是從sql優化的角度看,讓外部的條件去適應sql語句的查詢,這種思想我之前很少有,也算是一種思維的突破了!

相關推薦

記錄一個sql優化大大提高查詢效率情形

眾所周知,sql寫得怎麼樣,對於查詢效率的影響是頗大的。下面看一個比較普通的查詢: 假設一張表有event_date和event_time2個欄位分別表示日期和時間,現在直接給你一個時間字串,這個時間字串是“日期+時間”的組合,現在需要按時間範圍過濾出一部分資料。如果你不轉彎的話,很有可能你會按照慣性思維使

oracle sql強制走索引提高查詢效率

一般建表的時候加了縮影,使用這張表的對應欄位的時候,會走縮影,但是有時候會出現飄索引的現象;建議加上強制走索引的條件: select /*INDEX(bmq OPERATOR_CARD_MATCHE

一個千萬級的資料庫查尋中,如何提高查詢效率?分別說出在資料庫設計、SQL語句、java等層面的解決方案

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

實戰演練(二):執行20小時的報表SQL優化秒出

一、概述 這是我們SQL優化班的一個學員,據說該SQL在生產環境中已經運行了20個小時,快把伺服器的磁碟資源耗盡了。這20個小時,我們可愛的學員就是靠著刪除一些不重要的檔案才能夠勉強度過。  據瞭解,該SQL為一個月執行一次的跑報表的SQL,主要問題是隨著SQL的執行時間越來越長,所需

一個千萬級的資料庫查尋中,如何提高查詢效率

一、資料庫設計方面 1、對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引; 2、應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: select

資料庫提高查詢效率(較大資料)優化方法

1、資料庫設計方面: (1)建立索引 (2)分割槽(MySQL,如按時間分割槽) (3)儘量使用固定長度欄位和限制欄位長度。(如VARCHAR2(10);優勢:①降低物理儲存空間 ②提高資料庫處理速度 ③附帶校驗資料是否合法功能 2、在資料庫I/O方面: (1)增加緩衝區

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

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

50道高階sql練習題;大大提高自己的sql能力(附具體的sql)

問題及描述:--1.學生表Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別--2.課程表Course(CID,Cname,TID) --CID --課程編號,Cname 課程名稱,TI

資料庫按照手機號分庫,還需要允許使用者使用郵箱、使用者名稱等登入,怎麼才能提高查詢效率

回答:1.資料量特別大,就算使用者量再,相信貴公司的產品不會超過 3億賬號,若是如此的話,建議拆分的時候採用路由表的模式,而不是HASH,也即你們的拆分手段就做不對。2.若是按照手機號碼拆分的話,則會導致其他的 郵箱地址 和 編號登入的時候,需要掃描整個拆分庫,則效率會非常糟糕,建議迅速調整拆分的架構,折中的

一個千萬級的資料庫查尋中,如何提高查詢效率

在一個千萬級的資料庫查尋中,如何提高查詢效率? 1)資料庫設計方面:  a. 對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。  b. 應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放

年輕人的第一個 Docker 應用,大大提高生產力!

上一篇:[年輕人的第一個 Spring Boot 應用!](https://mp.weixin.qq.com/s/YNhoFtcvGuoY24fVQCPdmg) 哈哈,標題我抄了雷總的,不重要哦,重要的是 Docker 真的很年輕,雖然現在才不到 8 歲,但卻是個冉冉升起的巨星,火得一塌糊塗。 這幾年 D

常用SQL優化(一),提升運算效率

大數據 必須 -name 過大 一半 一次 存儲過程 是否 ins 網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 orde

oracle分區技術提高查詢效率

新特性 for from 回收站 如何 查看分區 har ash tables 概述: 當表中的數據量不斷增大,查詢數據的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區。表進行分區後,邏輯上表仍然是一張完整的表,只是將表中的數據在物理上存放到多個表空間

EasyUI表格手動設定分頁,提高查詢效率

1.前段時間發了一個EasyUI表格的製作,使用自動分頁方法,後來發現查詢效率太低,今天來設定手動分頁。在js中先宣告幾個全域性變數。 2.在查詢方法裡需要用ajax查詢資料數量,odata是返回的結果,chg_table是表的id,RefreshPageNumber方法是一個工具,稍後貼

5個Excel實用技巧,幫你大大提高工作效率

今天給大家分享5個Excel實用的小技巧,學會了可以幫助我們在日常工作中快速提高工作效率! 1.快速隱藏單元格資料 若是想對單元格中的某些資料隱藏,使用單元格自定義即可。 選中單元格資料,點選滑鼠右鍵選擇"設定單元格格式",點選"自定義",在"型別"一欄中輸入";;;"即可。 具體操作如下: 2.快

mysql通過建立分割槽和索引來提高查詢效率

1:建立分割槽 DROP TABLE IF EXISTS `test`; CREATE TABLE test ( id int(10) unsigned NOT NULL AUTO_INCREMENT, time datetime NOT NULL COMMENT '業務時間'

B-Tree作為索引能夠提高查詢效率的原理

要說明這個原理,首先要知道區域性性原理:當一個數據被用到時,其附近的資料也通常會馬上被使用。程式執行期間所需要的資料通常比較集中。 有了區域性性原理,作業系統磁碟的訪問方式就改變了,訪問資料的時候不

MongoDB學習筆記~索引提高查詢效率

回到目錄 索引這個東西大家不會陌生,只要接觸到稍微大一點的資料,都會用到這東西,它可以提升查詢的速度,相當代價就是佔用了更多的儲存空間,這也是正常的,符合“能量守恆定理”,哈哈!今天說的是MongoDB裡的索引,在我進行對500萬資料進行查詢測試時,發現如果你的查詢欄位不加索引,那是相當恐怖的,一個簡單的查

【資料庫】索引——快速提高查詢效率

             專案中用到了很多的索引,將一些關鍵欄位的很多都設定為索引。本部落格將和大家分享一些索引的基本知識     為什麼要使用索引?       使用索引,可以大大的提高系統

用charindex代替like中的%提高查詢效率

如: select * from [table1] where [field1] like ‘%test%’ 可以用如下語句代替: select * from [table1] where charindex('test', [field1]) > 0