共計 1107 個字符,預(yù)計需要花費 3 分鐘才能閱讀完成。
怎樣解決 5.5 版本升級 5.7.23SQL 不兼容的問題,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
從 5.5 升級到 5.7.23,反饋該 SQL 在兩個版本執(zhí)行結(jié)果不一樣 (5.5 的返回結(jié)果 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,理出子查詢?nèi)缦拢?/p>
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) ;
發(fā)現(xiàn)理出的子查詢在 5.5 跟 5.7.23 都是返回 30 條,由此發(fā)現(xiàn)帶 in 的子查詢可能存在差異
2) 查看 5.5 版本跟 5.7.23 的執(zhí)行計劃
5.5 版本
5.7.23 版本
由上圖可以得出結(jié)論,在 mysql5.7.23 中,將子查詢優(yōu)化成關(guān)聯(lián)查詢,在關(guān)聯(lián)時丟失了對 group by 的處理
3)sql 整改(將子查詢變?yōu)殛P(guān)聯(lián)查詢)
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 時,可能要對業(yè)務(wù)的查詢帶 group by/order by 的子查詢進行改造,方可升級
看完上述內(nèi)容,你們掌握怎樣解決 5.5 版本升級 5.7.23SQL 不兼容的問題的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!