MySQL中查詢計畫不一致 子查詢效率低解決方案

2021-07-26 05:40:01 字數 779 閱讀 6338

最近應用mysql做大資料查詢,發現兩個問題:

第一、相同的查詢語句,在不同的例項中,查詢計畫不一致;

第二、帶有子查詢的sql,執行奇慢無比。

問題一

由於資料庫中資料量不一致,或者配置不一致,可能導致查詢計畫不一致。

比如:對資料庫表t中的字段f1做查詢,f1中有三個值a、b、c,這三個值所佔的比例分別為1%、98%、1%,這時如果查詢f1=b,那麼,查詢計畫不會走索引。但是,查詢f1=a,則查詢計畫會走索引。

問題二

mysql會將最左邊的表作為主表,首先遍歷主表,然後再每條資料傳到子查詢中,與子查詢做關聯。這個非常重要,與oracle資料庫不一樣。這樣就導致了,如果主表資料很多,查詢就會變得非常慢。

舉個栗子 

表table1裡面包含幾個字段:id、pid、name、age,其中id和pid為索引,表中有10w條資料。

select t.* from table1 t where t.id in ((select t.id from table1 t  where t.pid > 10)  as s )

查詢結果時間10s+。

改寫成:

(select t.id from table1 t  where t.pid > 10) as s  left join table1 t on t.id = s.id

查詢結果時間0.079s。

效率提公升千倍不止。

所以一定要盡量選擇資料少的表做基礎表。

快取不一致

當程式在執行過程中,會將運算需要的資料從主存複製乙份到cpu的快取記憶體當中,那麼cpu進行計算時就可以直接從它的快取記憶體讀取資料和向其中寫入資料,當運算結束之後,再將快取記憶體中的資料重新整理到主存當中。舉個簡單的例子 i i 1。當執行緒執行這個語句時,會先從主存當中讀取i的值,然後複製乙份到...

version magic 不一致問題

碰到乙個問題,在開發過程中發現以前編譯的模組載入失敗了。wlan version magic 4.1.15 gfb2dbf6 smp preempt mod unload armv7 p2v8 should be 4.1.15 ge5de83b dirty smp preempt mod unloa...

ceph pg不一致問題

今天在公司環境中出現了pg不一致問題,通過ceph health detail命令檢視如下 pg 19.211 is active clean inconsistent,acting 88,16 pg 19.214 is active clean inconsistent,acting 59,36 ...