今天同事問到我一個問題,說某個帶有join的查詢陳述句創建視圖后,查詢視圖時帶有order by欄位時,某些欄位會很快,某些會稍微慢一些,
drop view if exists test1;
create view test1 as
select a.*,b.b_info_outstandingbalance,ifnull(b.new_count,0) new_count,ifnull(b.new_amount,0) new_amount,b.adj_term_year,b.private_percent from
blr_company_info a
inner join
(select company_id,b_info_outstandingbalance,new_count,new_amount,adj_term_year,private_percent from blr_company_bond_info where c_date = (select max(c_date) from blr_company_bond_info)) b
on a.company_id = b.company_id
具體創建視圖sql如上面所示,其中a表大概是五千條資料,而b表大概是四千條資料,當使用原在b表中的欄位做order by的時候就稍微快一些,a表中的欄位做order by就稍微慢一些,
然后我就做了個測驗:
a表的company_id
explain
select * from test1 order by company_id desc

b表的b_info_outstandingbalance
explain
select * from test1 order by b_info_outstandingbalance desc

兩個explain的區別就是上面的那個用到了臨時表,為什么會用到臨時表,為什么只有他用到了臨時表,之后又做了幾個實驗,發現只有join的主表中的欄位進行order by的時候才不會用到臨時表,而inner join的時候主表的選擇方式為資料量最少的表為主表,所以b表為主表,當b表中的欄位做order by的時候才不會用到臨時表,
另外多說一句:left join的主表選擇方式為左側表為主表,inner join主表選擇方式為資料量少的為主表,所以 left join的時候最好將資料量少的表放在左側,這樣的查詢速度會更快些,
具體關于explain的解釋可以移步到此處
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/196475.html
標籤:區塊鏈
