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

MySql語句關聯(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張小表。

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

回答
編輯回答
心悲涼

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

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

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

2017年7月5日 11:12