1. 程式人生 > >資料庫sql優化總結之2-百萬級資料庫優化方案+案例分析

資料庫sql優化總結之2-百萬級資料庫優化方案+案例分析

專案背景

有三張百萬級資料表

知識點表(ex_subject_point)9,316條資料

試題表(ex_question_junior)2,159,519條資料 有45個欄位

知識點試題關係表(ex_question_r_knowledge)3,156,155條資料

測試資料庫為:mysql (5.7)

7、在 where 子句中使用引數,是不會導致全表掃描。

案例分析


8、在 where 子句中對欄位進行表示式操作,不會導致全表掃描。不過查詢速度會變慢,所以儘量避免使用。

案例分析

執行時間是1.064s

優化方案

SELECT ex_question_junior.QUESTION_ID
FROM ex_question_junior 
WHERE ex_question_junior.QUESTION_CHANNEL_TYPE =4/2;
執行時間是0.012s

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

案例分析

優化方案

SELECT *
FROM ex_subject_point 
WHERE CREATE_DT >= "2018-05-31"
AND CREATE_DT < "2018-07-01"
但是EXPLAIN一下,發現這樣還是全表掃描的

難道是因為日期欄位索引沒有效果嗎?還是因為用了>=和<運算子號?來驗證一下縮小查詢範圍,發現索引是有效果的。所以不是日期欄位的問題。

換個欄位查詢,用>=和<運算子號,索引還是有效果的。但那是什麼原因呢?

後來去網上查找了資料,原因是查詢數量是超過表的一部分,mysql30%,oracle 20%(這個資料可能不準確,不是官方說明,僅供參考),導致索引失效。

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

例子請看第8點和第9點。

11.在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用(這個在mysql中不對),並且應儘可能的讓欄位順序與索引順序相一致。

案例分析

複合索引欄位:PATH,PARENT_POINT_ID
調換WHERE子句中的條件順序。發現還是可以使用索引的

複合索引只查詢第一個欄位,是有效果的

複合索引只查詢第二個欄位,發現索引沒有效果了。

12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:(一般開發也不會這麼無聊啦,在正式的專案上寫這種玩意)

select col1,col2 into #t from t where 1=0這類程式碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:create table #t(…)

參考:

https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e696b2063e43cd9ccb40df101&chksm=97be0c01a0c98517029ff9aa280b398ab5c81fa1fcfe0e746222a3bfe75396d9eea1e249af38&mpshare=1&scene=1&srcid=0606XGHeBS4RBZloVv786wBY#rd

***************************************************************************

作者:小虛竹
歡迎任何形式的轉載,但請務必註明出處。
限於本人水平,如果文章和程式碼有表述不當之處,還請不吝賜教。


我不是個偉大的程式設計師,我只是個有著一些優秀習慣的好程式設計師而己


相關推薦

資料庫sql優化總結2-百萬資料庫優化方案+案例分析

專案背景有三張百萬級資料表知識點表(ex_subject_point)9,316條資料試題表(ex_question_junior)2,159,519條資料 有45個欄位知識點試題關係表(ex_question_r_knowledge)3,156,155條資料測試資料庫為:m

資料庫sql優化總結1-百萬資料庫優化方案+案例分析

專案背景 有三張百萬級資料表 知識點表(ex_subject_point)9,316條資料 試題表(ex_question_junior)2,159,519條資料 有45個欄位 知識點試題關係表(ex_question_r_knowledge)3,156,155條資料

資料庫SQL優化總結 百萬資料庫面試優化方案

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查詢資料、修改、排版,希望大家閱讀之後,感覺好的話推薦給更多的人,讓更多的人看到、糾正以及補充。   一、百萬級資料庫優化

資料庫SQL優化總結 百萬資料庫優化方案

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查詢資料、修改、排版,希望大家閱讀之後,感覺好的話推薦給更多的人,讓更多的人看到、糾正以及補充。 1.對查詢進行

資料庫SQL優化總結百萬資料庫優化方案

網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查詢資料、修改、排版,希望大家閱讀之後,感覺好的話推薦給更多的人,讓更多的人看到、糾正以及補充。 1.對查詢進行優化

資料庫SQL優化總結1- 百萬資料庫優化方案

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

sql 百萬資料庫優化方案

2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where num is null可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:select id from t where num=0

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

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

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

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

百萬資料庫優化方案

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

百萬資料庫效能優化(一)——建立索引

對查詢進行優化,要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 為了能夠使用索引,我們應該避免使用以下查詢方式: 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表

mysql+SQL資料庫優化和書寫原則,千萬資料庫記錄查詢輕鬆解決

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

5.簡單sql註入2

web安全 sql註入 ctf 實驗吧 提示:有回顯的sql註入 這題其實使用上一篇博文的/**/技術即可獲得flag 上一篇博文簡單sql註入補充: 其實那題還過濾了關鍵詞加空格(只過濾一遍,所以寫兩遍即可),出題者考的是如下sql語句(空格和關鍵詞都要寫兩遍)

Netty 系列 Netty 百萬推送服務設計要點

Netty 系列之 Netty 百萬級推送服務設計要點 李林鋒 2015 年 1 月 4 日 話題:語言 & 開發架構 1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,

Netty系列Netty百萬推送服務設計要點-轉載

1. 背景 1.1. 話題來源 最近很多從事移動網際網路和物聯網開發的同學給我發郵件或者微博私信我,諮詢推送服務相關的問題。問題五花八門,在幫助大家答疑解惑的過程中,我也對問題進行了總結,大概可以歸納為如下幾類: Netty是否可以做推送伺服器? 如果使用Netty開

機器學習總結----2.邏輯迴歸

我也只是在學習的過程中,相當於自己理解推導一遍做個筆記,參考了別人很多東西,文末有相關連結。 什麼是邏輯迴歸 邏輯迴歸也叫做對數機率迴歸,但它卻用來做二分類。 線性迴歸產生的預測值為 z=θTxz = \theta^{T}xz=θTx,線性迴歸通常用來做迴歸。

Oracle學習總結2)——Oracle資料庫設計總結(三大正規化)

一、實體與表對應關係 表<=>實體,欄位<=>屬性。 二、表與表的關係(實體間的關係):一對一、一對多、多對多 一對一:一條記錄只對應其他表中的一條記錄有關係 學生基本資訊表t_student,成績表t_studentScore含有一個外來

資料庫--SQL語句總結

SQL語句總結 如何用SQL語句新增,刪除和修改資訊 1.刪除 刪除請求的表達和查詢非常類似,我們可以刪除整個元組,但不能只刪除某個屬性上的值.刪除語句是: delete from r; where P; r代表一個關係,p代表一個謂詞,delete語句首先從r 中找出所有使p(t)為真

Mysql資料庫的使用總結ERROR 1146 (42S02)

網上查詢解決辦法時,發現也有不少人有這個問題,而按照停止服務再拷貝的方式還是不行(我剛開始也不行,不過後來就好了,怪了,不知道為什麼)。所以這裡再說一種方法。首先在自己的mysql下,建立一個你即將要拷貝的資料庫(資料庫名要一樣,裡面不需要建表),然後將所有的.frm檔案拷貝到你建的資料庫資料夾下,此時再次進

工作總結----java程式碼連線資料庫(SqlServer和oracle)

程式碼:import java.sql.*; public class JDBCUtil { private static final String DBDRIVERSQLSWRVER = "c