1. 程式人生 > >MySQL的in查詢效率太低的解決辦法之一與其它優化示例

MySQL的in查詢效率太低的解決辦法之一與其它優化示例

最近在做一個MySQL資料庫的查詢(查詢出指定時間之後凡是上傳過圖片的使用者所在的鎮和鎮的管理員名),查詢語句如下:

 SELECT DISTINCT user_name,town_name FROM t_farmers WHERE id IN 
(SELECT DISTINCT farmer_id FROM t_farmers_images WHERE create_time>='2017-07-05') 

其中farmers表有六千多記錄,farmers_images表有近20萬條記錄,查詢效率極低,此查詢估計能夠耗十分鐘的時間,無法忍受,於是尋找解決辦法,

網上有說加索引解決的,但是個人感覺這個資料量並不大,加索引即使能夠解決問題,等日後資料量逐漸增大之時這似乎並不是一個非常好的辦法。

網上還有說把in改為exist,但是查詢效率似乎並沒有什麼改變。通過搜閱資料得知in適合用於子表小的情況,而exist適合子表大主表小的情況,(僅代表一家之言,可能有不到之處,日後細究)。

解決方法如下:

經對資料庫方面的文章參考,最終找到了一個方法,把in改為左連線右連線的方式,於是把sql語句改為如下:

 SELECT DISTINCT b.user_name,b.town_name FROM (SELECT DISTINCT farmer_id FROM t_farmers_images WHERE create_time>='2017-08-18') a
LEFT JOIN t_farmers b ON a.farmer_id=b.id  查詢效率瞬間提升,幾乎感覺不到有什麼延遲。

詳細的左連線,右連線,內連線等的查詢和哪種適合左邊表大,哪種適合右邊表大,哪種查詢具體適合什麼情形,請自行網上查詢。

查詢2月1號之後,總數之和超過300的使用者:

SELECT mm.*,c.user_name,c.town_name,c.name,c.tel,c.card_id,c.onecard_id FROM (
SELECT a.farmer_id,SUM(death_number) FROM t_farmers_details a
WHERE a.date_time>='2017-02-01' GROUP BY a.farmer_id HAVING SUM(death_number)>=300 ) mm
LEFT JOIN t_farmers c ON c.id=mm.farmer_id

此外做專案時有經常需要用到多表查詢的情況,這種情況下一般不適用笛卡爾積,因為笛卡爾積的開銷太大,查詢太慢,到現在才明白為什麼兩年前別人的專案中都用左連線,右連線之類的查詢,而沒有使用笛卡爾積了,兩年了才明白別人當初的業務邏輯,還需要加把勁更加努力進步!

2017.12.07需要對已有系統進行優化,其中有一個匯出Excel的功能,使用者量小的時候匯出功能正常,但是使用者量大的時候匯出特別慢,甚至網路差的時候還會出現匯出失敗的情況,起初以為是前端匯出Excel效率低下的原因,後來經測試發現是資料庫查詢效率太差,

最初sql語句寫法為:

SELECT a.*,(SELECT SUM(death_number) death_number FROM t_farmers_details 
WHERE date_time LIKE '%2017-12%' 
AND farmer_id =a.id ) harmless_quantity 
FROM t_farmers a WHERE 1=1 

優化後sql語句寫法為:

SELECT a.*,b.harmless_quantity 
FROM t_farmers a LEFT JOIN 
(SELECT b.farmer_id,SUM(b.death_number) harmless_quantity FROM t_farmers_details b 
WHERE b.date_time LIKE '%2017-12%' GROUP BY b.farmer_id ) b ON a.id=b.farmer_id 
WHERE 1=1 

核心修改時將笛卡爾積修改為了左連線,

這樣一來原來需要幾分鐘匯出的一個Excel,現在只需幾秒鐘解決,特此記錄。

相關推薦

MySQL的in查詢效率解決辦法之一其它優化示例

最近在做一個MySQL資料庫的查詢(查詢出指定時間之後凡是上傳過圖片的使用者所在的鎮和鎮的管理員名),查詢語句如下:  SELECT DISTINCT user_name,town_name FROM t_farmers WHERE id IN  (SELECT DIST

mysql中RAND()隨便查詢記錄效率問題和解決辦法分享

在我們做開發的中效率一直是個問題,特別是對於很多大資料量操作,今天我們碰到一個要隨機查詢資料,一開始我們可能想到最簡單的order by rand() 來操作但效率不敢恭維啊 最近由於需要大概研究了一下MYSQL的隨機抽取實現方法。舉個例子,要從tablename表中隨機提

mysql不支持在子查詢中使用limit解決辦法

3.4 沒有 derived 就是 報錯 this limit support lec mysql不支持在子查詢中使用limit解決辦法 This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/

C#中HttpWebRequest的GetRequestStream執行的效率,甚至偶爾死掉

C#中HttpWebRequest的GetRequestStream執行的效率太低,甚至偶爾死掉 2014-04-19 15:14 3290人閱讀 評論(0) 收藏 舉報 分類:

Android開發——資料庫框架Suger遇到的大坑(依據列名查詢不到資料解決辦法

Android開發——資料庫框架Suger遇到的大坑(依據列名查詢不到資料解決辦法) JavaBean命名出現大寫,資料無法正常儲存(用的是Suger第二種操作方式,第一種沒有測試) 習慣中對Bean中變數的命名會出現大寫字母,但使用Suger操作這樣的資料會出現問題,比如我這樣命名

.svn檔案解決辦法

svn下載程式碼後一段時間.svn檔案會很大,包含了各種備份檔案,但是如果直接刪除.svn檔案裡的內容的話再執行svn命令又會報錯,所以我們可以採用tortoiseSVN自帶的cleanup為資料夾瘦身 操作步驟:右鍵svn資料夾  --->   clean up ..

spring boot正常啟動之後無法訪問報404的解決辦法之一

網上都說是 啟動類的放置位置錯誤導致的! 這個錯誤資訊包含的有效資訊不是很多,有很多因素 我的原因是: freemarker: suffix: .ftl request-context-attribute: request freemarker的字尾改為了.ftl&nb

Excel2007設定過單元格格式後,並不能立即生效必須挨個雙擊單元格,才能生效。資料行很多,效率

原因:Excel2007設定過單元格格式後,並不能立即生效必須挨個雙擊單元格,才能生效。資料行很多。效率太低。 原因:主要是一些從網上拷貝過來的日期或數字excel預設為文字格式或特殊-中文數字格式大小寫。 手動設定單元格,將格式改成日期格式,但仍不能參與計算。只有挨個單元格雙擊,才能生效;才可以計

業商機轉化效率?AI來破題!

“低效率”、“高成本”無疑已經成為當下傳統聯絡中心的關鍵詞。 許多有大量主動聯絡需求的科技金融、保險、線上教育等行業受制於傳統聯絡中心的弊端,企業的商機轉化效率低下等諸多問題開始逐一顯現。如何提升商機轉化效率也成為了科技金融、保險、線上教育等行業亟待解決的問題。在此大背景下,容聯雲聯絡中心成為提高企業商機轉

SSM+maven框架搭建好以後出現了406錯誤解決辦法之一

淘淘商城SSM+maven框架搭建好以後出現了406錯誤解決辦法之一 最近使用SSM+maven搭建框架來做淘淘商城專案,在測試item/{id}時出現一個406錯誤。 本專案框架圖如下: 現在開始執行: 專案啟動以後在頁面訪問: 訪問/item/562379時出

驗證DNS解析失敗:解決辦法之一

今天晚上練習簡單的DNS解析驗證: 環境是在一臺虛擬機器上搭建,另一臺虛擬機器驗證,步驟如下: 虛擬機器A: 1.安裝軟體包 bind  和bind-chroot[[email protected] ~]# yum -y install bind-chroot bind 2.修改主配置檔案  /et

企業商機轉化效率?AI來破題!

“低效率”、“高成本”無疑已經成為當下傳統聯絡中心的關鍵詞。   許多有大量主動聯絡需求的科技金融、保險、線上教育等行業受制於傳統聯絡中心的弊端,企業的商機轉化效率低下等諸多問題開始逐一顯現。如何提升商機轉化效率也成為了科技金融、保險、線上教育等行業亟待解決的問題。在此大背景下,容聯雲聯絡中心成

Maven小坑:IDEA開發工具中對於maven專案進行mvn install報錯的解決辦法之一(前提不是程式碼錯誤)

今天公司前輩給了我一個專案,要我熟悉熟悉,以後會在這裡面進行開發;在我使用Iidea自帶的控制檯進行mvn install命令的時候,發先mvn install失敗(這裡的報錯可能會有多種,就是因為在install的時候沒有找到資源,不一一舉例了); 經過一番程式碼以及包的檢查,發現沒有錯誤

tomcat啟動解決辦法

1.tomcat啟動太慢解決辦法:在Tomcat環境中解決 可以通過配置JRE使用非阻塞的Entropy Source。 在catalina.sh中加入這麼一行:-Djava.security.egd=file:/dev/./urandom 即可。 加入後再啟動Tomcat,整個啟動耗時

關於sed命令去除文本當中每個欄位前後空格及tab效率低下的解決辦法

最近使用到sed命令進行文字處理,因從資料庫中獲取到的欄位當中有個別字段中間包含空格,而最終儲存時候要保證每個欄位資料的完整性,所以預設的文字分割方式不能使用。 首先使用read讀取一行資料line_data,再根據分隔符'"'進行拆分,拆分結果儲存到split_data中,因資料的列數可以確定

產品:研發效率,很小的需求就開發兩週,程式設計師:要不你來?

在網際網路公司,不論web網站還是app,產品經理與軟體開發的程式設計師是兩個比較重要的角色,(當然平面設計,測試人員等也很重要),產品經理與程式設計師之間的分工也是相當明確,產品負責產品的規劃與業務邏輯設計,而程式設計師負責實施開發,他們之間也是需要有著密切的

自建工具類引用service層或dao層介面報空指標異常解決辦法之一

問題描述:想要建一個工具類進行資料同步,其中要用到service層或dao層的資料查詢介面,正常構建工具類,用@Autowired註解匯入service層。在專案測試時報空指標異常,發現是service層介面注入失敗。 解決方法:將你的工具類變成spring容器:1.將

android studio 執行按鈕為灰色的解決辦法之一

先說說我的情況。安裝完android studio 3.2 和SDK,配置好環境後,我新建了一個hello world專案,gradle download 下載半天沒有動靜我就離線下載了一下對應的包然後放到對應路徑下,再次重啟這個專案,專案搭建完成,準備執行。 但是發現如下問題,run

SpringBoot內建tomcat出現APR版本過解決辦法

2018-03-20 13:32:01.022 ERROR 13152 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : An incompatible version [1.1.32] of the APR based Apac

eclipse啟動無響應問題的解決辦法之一

方法之一:       1.進入workspace/.metadata/.plugins/       2.將org.eclipse.core.resources檔案壓