一、mysql中in大量數據導致查詢速度慢怎么優化
拆分sql語句
mysql中in大量數據導致查詢速度慢,優化的(de)(de)名列前茅種(zhong)方案是拆(chai)分(fen)sql子查詢,將一條sql拆(chai)為兩條sql,將in內部的(de)(de)sql拆(chai)分(fen)出來(lai),取出isbn集合(he)列表,然后(hou)利用mybatis的(de)(de)sql拼(pin)接(jie)的(de)(de)功能,拼(pin)成完整的(de)(de)sql語(yu)句。
Xml代碼如下所示,名(ming)列前茅步(bu)首先利(li)用時間(jian)參數分頁取出(chu)isbn列表(biao)
??? SELECT isbn FROM tb_book_base WHERE publish_time BETWEEN #{fromTime} AND #{toTime} LIMIT #{offset},#{size}
第二(er)步先(xian)在服務層中判斷上一輪取出的isbn列表是否(fou)為空,如(ru)(ru)果(guo)不為空繼續向下執行,如(ru)(ru)果(guo)isbn集合列表不為空,繼續利用mybatis提供的xml動態(tai)標(biao)簽功能(neng),拼接出in查詢條件
?? SELECT * FROM tb_book_main WHERE isbn IN (
???
??????? #{isbn}
???
?? )
聯結代替子查詢
這種方案原理還是避免(mian)子(zi)查(cha)詢,將子(zi)查(cha)詢語(yu)句改(gai)寫(xie)(xie)為聯結查(cha)詢,改(gai)寫(xie)(xie)后的(de)sql語(yu)句如下(xia)所示
SELECT
??? t1.isbn,
??? code
FROM
??? tb_book_main t1
??? INNER JOIN
??? ( SELECT isbn FROM tb_book_base WHERE publish_time BETWEEN 20190903 AND 20191003 ) t2
on t1.isbn = t2.isbn
AND role= 100
limit 0,10
使用explain查看索引(yin)命中情況(kuang),mysql按(an)照預(yu)期命中了(le)tb_book_base的publish_time和tb_book_main的isbn索引(yin)
延伸閱讀:
二、什么是Memory引擎
Memory引擎(qing)是Mysql的(de)(de)內(nei)存(cun)引擎(qing),在實現上(shang),Memory存(cun)儲引擎(qing)不(bu)同于(yu)Innodb這(zhe)種(zhong)組(zu)織索(suo)引結構(gou)(索(suo)引即(ji)是數據(ju),即(ji)數據(ju)存(cun)放在主鍵(jian)索(suo)引上(shang)),而是將索(suo)引和數據(ju)分開存(cun)儲。索(suo)引采用Hash的(de)(de)形式(shi),存(cun)放主鍵(jian)id和指向數據(ju)的(de)(de)指針,而數據(ju)則按插入順序存(cun)放。我們稱這(zhe)種(zhong)數據(ju)組(zu)織方式(shi)為堆(dui)組(zu)織方式(shi)。