需求:組合查詢,按條件統計某幾個欄位取前100條記錄
問題:沒建索引導致查詢結果耗時5秒多,不能忍受。
解決方法:
建索引,在哪個欄位建?
在這裡先提下oracle的sql語句的執行。oracle在執行sql語句之前會用優化器optimizer對sql語句進行解析,解析出最優的執行計畫再執行,這樣所花費的時間最少,效率最快。
優化器優化方式有兩種:
(1)基於規則的優化(rule-based optimization,簡稱為rbo) ,優化器在解析sql的時候會遵循oralce的一些內部規則,比如在遇到where子語句中某個欄位上有索引就用索引。
(2)基於代價的優化(cost-based optimization,簡稱為cbo),基於代價主要指消耗cpu和記憶體,優化器若使用這種方式解析,主要是參考表和索引的統計資訊,比如表大小,行數,行長度等資訊。
根據上面兩條,結合實際情況,最後在時間欄位上建了索引。在實際應用中,因為id號是自動生成的,我們並不知道每條記錄的id號,所以我們很難在實踐中用id號來進行查詢。這就使讓id號這個主鍵作為聚集索引成為一種資源浪費。其次,讓每個id號都不同的字段作為聚集索引也不符合「大數目的不同值情況下不應建立聚合索引」規則;當然,這種情況只是針對使用者經常修改記錄內容,特別是索引項的時候會負作用,但對於查詢速度並沒有影響(
sql語句如下:
select key,
searchtype from
(select keyword,
searchtype,
sum(search_num) searchnum,
sum(searchuser_num) searchusernum,
sum(order_num) ordernum,
sum(orderuser_num) orderusernum,
sum(browse_num) browsenum,
sum(browseuser_num) browseusernum
from rp_demo_test t
where t.update_time between '20150101' and '20150131'
and t.searchtype = 'all'
group by key, searchtype
order by searchnum desc) where rownum < 100;
上面sql語句執行,發現耗時主要花費在order by上,即使在時間上建了索引,查詢耗時仍然沒什麼改進。現在問題聚焦在怎麼改善order by的效能上。解決方法是在時間上建立倒序索引(補充一句:oracle儲存索引採用的是b*樹結構,建立的索引預設是asc公升序的。採用倒敘索引查詢耗時從5秒多降至2秒甚至1秒以內。如果查詢時間跨度過大,耗時在2秒左右。還有個問題是不使用rownum,會走索引,耗時在一秒以內。如果加上就不走索引了,耗時一秒多。因為要取表的前100行,rownum必須要,加上了就得全表掃瞄,耗時會有所增加,甚是頭疼!
疑問:倒敘索引是怎麼提高order by語句的查詢效能的?
mysql千萬級資料查詢
1.mysql的資料查詢,大小欄位要分開,這個還是有必要的,除非一點就是你查詢的都是索引內容而不是表內容,比如只查詢id等等 2.查詢速度和索引有很大關係也就是索引的大小直接影響你的查詢效果,但是查詢條件一定要建立索引,這點上注意的是索引字段不能太多,太多索引檔案就會很大那樣搜尋只能變慢 3.查詢指...
Oracle 千萬級別資料查詢優化
說明 平時很少接觸到大資料分頁,今天有興趣在資料庫插入1000萬條資料進行測試,經過查詢相關資料得到如下說明 筆者在工作中有一上百萬條記錄的表,在jsp頁面中需對該錶進行分頁顯示,便考慮用rownum來做,下面是具體方法 每頁顯示20條 語句 select from tabname where ro...
MySQL處理千萬級資料查詢 分頁
mysql資料庫優化處理實現千萬級快速分頁分析,來看下吧。資料表 collect id,title info vtype 就這4個字段,其中 title 用定長,info 用text,id 是逐漸,vtype是tinyint,vtype是索引。這是乙個基本的新聞系統的簡單模型。現在往裡面填充資料,填...