5.5版本升級5.7.23SQL不相容一例

風塵_NULL發表於2020-04-29

現象:

公司一業務從5.5升級到5.7.23,業務反饋一SQL,該SQL在兩個版本執行結果不一樣(5.5的返回結果30條,而5.7.23返回57條)

SELECT * from k_xxx where sequence>0 AND starttime<='2019-03-28 18:26:06' and  id in (SELECT b.id FROM (SELECT * FROM k_xxx as a WHERE a.status=1 AND a.sequence>0 AND a.starttime<='2019-03-28 18:26:06' ORDER 
BY a.starttime DESC,a.edittime DESC) as b GROUP BY b.sequence);

分析:

1)拆分sql,理出子查詢如下:

SELECT b.id FROM (SELECT * FROM k_recommend as a WHERE a.status=1 AND a.sequence>0 AND a.starttime<='2019-03-28 18:26:06' ORDER 
BY a.starttime DESC,a.edittime DESC) ;

發現理出的子查詢在5.5跟5.7.23都是返回30條,由此發現帶in的子查詢可能存在差異


2)檢視5.5版本跟5.7.23的執行計劃

5.5版本

5.7.23版本


由上圖可以得出結論,在mysql5.7.23中,將子查詢最佳化成關聯查詢,在關聯時丟失了對 group by的處理

3)sql整改(將子查詢變為關聯查詢)

select * from (SELECT a.* FROM k_xxx as a inner join k_xxx as b WHERE a.sequence>0 AND a.starttime<='2019-03-28 18:26:06' and  a.status=1  and a.id=b.id group by a.sequence order by a.starttime DESC,a.edittime DESC) as b order by b.sequence;

結論:

在升級mysql5.7時,可能要對業務的查詢帶 group by/order by的子查詢進行改造,方可升級


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30221425/viewspace-2689354/,如需轉載,請註明出處,否則將追究法律責任。

相關文章