最近發(fā)現(xiàn)項(xiàng)目中首頁某個(gè)查詢很慢,點(diǎn)進(jìn)代碼一看原來是當(dāng)時(shí)用到了很多FIND_IN_SET函數(shù)查詢(因?yàn)楸碇凶侄问鞘褂枚禾?hào)分隔的字符串)赁豆,F(xiàn)IND_IN_SET函數(shù)是不走索引的理郑,那么對(duì)于FIND_IN_SET函數(shù)我們該如何優(yōu)化呢坯辩?查閱了很多博客發(fā)現(xiàn)下面這種方法:MySQL為我們提供了一個(gè)help_topic表,該表中索引是從0自增的一共600多行蹋盆,可使用該表把使用特定字符分隔的字符串替換成一列一列的數(shù)據(jù),可將FIND_IN_SET函數(shù)替換成IN查詢
SELECT
#截取字符串 比如當(dāng)前字符串為 '1,2,3,4' 會(huì)將字符串截取為
#0 1
#1 2
#2 3
#3 4
#help_topic表中剩余的列全將為字符串最后一位
help_topic_id,
substring_index( substring_index( '1,2,3,4', ',', help_topic_id + 1 ), ',',- 1 )
FROM
mysql.help_topic
WHERE
#控制行數(shù) (字符串整個(gè)長度 - 去掉分隔符的長度)+ 1 = 當(dāng)前字符串中所有被截取有效數(shù)據(jù)
help_topic_id < ( length( '1,2,3,4' ) - length( REPLACE ( '1,2,3,4', ',', '' ))+ 1 );