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