專案中發現有乙個查詢響應非常慢,花時間分析以及優化,特地記錄。
(1)背景
專案採用mysql資料庫,操作使用ibatis;
(2)查詢說明
這個查詢是每次查詢一定數目的使用者資訊,查詢中涉及到多表關聯,具體查詢sql如下
select s.name as name,
s.image as image,
s.id as id,
c.name as companyname,
c.id as companyid,
a.file_name as resourcefilename,
a.file_path as resourcefilepath,
a.file_id as resourcefileid,
count(r.contact) as updresourcesize
from sys_user_info s
left join attach_file_info a on s.id = a.user_id
left join
(select resource_id,contact from company_resource_info
where updtime >= #updresourcetime:timestamp# ) r
on s.id = r.contact,
company_info c
where s.company_id = c.id
group by s.id
limit 15
注意其中用到了子查詢,涉及到臨時表
(3)分析過程
使用mysql自帶的profiler分析結果如下圖
觀察可得,99%的時間花在了拷貝資料到臨時表上,也就是與其中的子查詢有關係。
想來奇怪,如果只是limit 15條資料,臨時資料不應該花費這麼多時間;個人覺得問題應該出在limit對於裡面的子查詢無效,也就是裡面的子查詢會涉及到全部資料,從而導致臨時表消耗很大的時間,這樣就不難理解了。
(4)優化
想清楚了上面的原因,解決的思路也就比較清楚了,只要讓裡面涉及的子查詢只查limit對應的資料就可以了。
重新實行的方式如下:
select count(1) from company_resource_info
where contact = #contact#
and updtime >= #updresourcetime:timestamp#
select s.name as name,
s.image as image,
s.id as id,
c.name as companyname,
c.id as companyid,
a.file_name as resourcefilename,
a.file_path as resourcefilepath,
a.file_id as resourcefileid,
#updresourcetime:timestamp# as updresourcetime
from sys_user_info s
left join attach_file_info a on s.id = a.user_id
left join company_info c on s.company_id = c.id
limit 15
主要的做法就是,每次先查出limit 15條不含子查詢結果的資料,定義乙個resultmap對映結果集,針對每一條記錄再去分別呼叫一次查詢從而得到最後想要的結果。 linux
MySQL關聯查詢優化例項
專案中發現有乙個查詢響應非常慢,花時間分析以及優化,特地記錄。1 背景 專案採用mysql資料庫,操作使用ibatis 2 查詢說明 這個查詢是每次查詢一定數目的使用者資訊,查詢中涉及到多表關聯,具體查詢sql如下 select s.name as name,s.image as image,s.i...
MySQL優化之關聯查詢優化
前言 sql語句優化是很重的乙個事情。所以要去做。正文一 left join 先寫乙個sql語句看看怎麼效能如何 這樣的情況怎麼去優化呢?肯定是使用到的查詢欄位去建索引。哪就先給idx card表的card欄位加上索引看看有沒有效果。執行 alter 建完索引後再接著執行咱們的查詢語句看看怎麼樣了。...
mysql關聯查詢去重 MySQL 關聯查詢
mysql 關聯查詢 sql資料分析 1週前 mysql 關聯查詢 前面,我們介紹的都是單錶查詢 就是只從一張表中獲取資料 而實際應用的時候,我們都會同時查詢多張表,這裡,我們就介紹下,多表關聯查詢的使用。sql join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料 前置知識 主鍵 p...