一、mysql中in大量數(shù)據(jù)導(dǎo)致查詢(xún)速度慢怎么優(yōu)化
拆分sql語(yǔ)句
mysql中in大量數(shù)據(jù)導(dǎo)致查詢(xún)速度慢,優(yōu)化的名列前茅種方案是拆分sql子查詢(xún),將一條sql拆為兩條sql,將in內(nèi)部的sql拆分出來(lái),取出isbn集合列表,然后利用mybatis的sql拼接的功能,拼成完整的sql語(yǔ)句。
Xml代碼如下所示,名列前茅步首先利用時(shí)間參數(shù)分頁(yè)取出isbn列表
??? SELECT isbn FROM tb_book_base WHERE publish_time BETWEEN #{fromTime} AND #{toTime} LIMIT #{offset},#{size}
第二步先在服務(wù)層中判斷上一輪取出的isbn列表是否為空,如果不為空繼續(xù)向下執(zhí)行,如果isbn集合列表不為空,繼續(xù)利用mybatis提供的xml動(dòng)態(tài)標(biāo)簽功能,拼接出in查詢(xún)條件
?? SELECT * FROM tb_book_main WHERE isbn IN (
???
??????? #{isbn}
???
?? )
聯(lián)結(jié)代替子查詢(xún)
這種方案原理還是避免子查詢(xún),將子查詢(xún)語(yǔ)句改寫(xiě)為聯(lián)結(jié)查詢(xún),改寫(xiě)后的sql語(yǔ)句如下所示
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查看索引命中情況,mysql按照預(yù)期命中了tb_book_base的publish_time和tb_book_main的isbn索引
延伸閱讀:
二、什么是Memory引擎
Memory引擎是Mysql的內(nèi)存引擎,在實(shí)現(xiàn)上,Memory存儲(chǔ)引擎不同于Innodb這種組織索引結(jié)構(gòu)(索引即是數(shù)據(jù),即數(shù)據(jù)存放在主鍵索引上),而是將索引和數(shù)據(jù)分開(kāi)存儲(chǔ)。索引采用Hash的形式,存放主鍵id和指向數(shù)據(jù)的指針,而數(shù)據(jù)則按插入順序存放。我們稱(chēng)這種數(shù)據(jù)組織方式為堆組織方式。