鍍金池/ 問答/Linux  數(shù)據(jù)庫/ MySql語句關(guān)聯(lián)優(yōu)化問題,為什么加了限制條件反而更慢?

MySql語句關(guān)聯(lián)優(yōu)化問題,為什么加了限制條件反而更慢?

Sql語句如下

 select u.name,
       u.user_id,
       u.phone,
       a.title,
       a.address,
       r.device_id,
       r.type,
       b.money,
       b.pay_type,
       r.create_time,
       r.reward_money
  from(
select device_id, out_trade_no, reward_money, type, c_address_id, create_time
  from charge_reward_bill
 where  type=3  and user_id='100034' and create_time>='2018-02-13' and create_time<'2018-03-14') as r
  inner join charge_bill b on b.out_trade_no= r.out_trade_no and b.pay_time<'2018-03-14' and b.pay_time>='2018-02-13' #如果把pay_time的限制條件加上反而更慢了
  inner join device_address_change a on a.id= r.c_address_id
  left join user_app_info u on u.user_id= a.user_id
 order by r.create_time desc
 limit 10000,10

charge_reward_bill數(shù)據(jù)量700W左右,charge_bill數(shù)據(jù)量200W左右,均已分庫分表,device_address_change 和user_app_info 是2張小表。

目前來說,查詢速度比較慢,第一個(gè)表不用子查詢也會(huì)更慢
問題:charge_bill 這個(gè)表關(guān)聯(lián)為什么加上時(shí)間的限制條件反而會(huì)更慢呢? pay_time上沒有索引,字段類型為datetime
,求大佬們說說,或者給點(diǎn)優(yōu)化思路

回答
編輯回答
心悲涼

inner join本來走一個(gè)關(guān)聯(lián)字段的索引就夠了
你非要讓人家回表再篩選一遍當(dāng)然慢了
要優(yōu)化就結(jié)合業(yè)務(wù),
1、子查詢里面索引選擇是不是最優(yōu)了,比如user_id是不是會(huì)比create_time更快?
2、1表2表使用了out_trade_no關(guān)聯(lián),看字段名應(yīng)該是交易單號(hào)一類的,這種是否還需要在2表進(jìn)行時(shí)間篩選?
3、最后一個(gè)排序加limit是最耗時(shí)的,內(nèi)存排序再過濾掉幾萬數(shù)據(jù)明顯不合理,嘗試其他方式篩選,比如時(shí)間劃分粒度更小一點(diǎn),翻頁功能實(shí)現(xiàn)網(wǎng)上方案很多,多看下,借鑒一下別人的實(shí)現(xiàn)方式

2018年1月31日 14:33
編輯回答
失心人

試試把b.pay_time<'2018-03-14' and b.pay_time>='2018-02-13'這兩個(gè)條件寫到where條件里

2017年7月5日 11:12