最近发现项目中首页某个查询很慢,点进代码一看原来是当时用到了很多FIND_IN_SET函数查询(因为表中字段是使用逗号分隔的字符串),FIND_IN_SET函数是不走索引的,那么对于FIND_IN_SET函数我们该如何优化呢?查阅了很多博客发现下面这种方法:MySQL为我们提供了一个help_topic表,该表中索引是从0自增的一共600多行,可使用该表把使用特定字符分隔的字符串替换成一列一列的数据,可将FIND_IN_SET函数替换成IN查询
SELECT
#截取字符串 比如当前字符串为 '1,2,3,4' 会将字符串截取为
#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
#控制行数 (字符串整个长度 - 去掉分隔符的长度)+ 1 = 当前字符串中所有被截取有效数据
help_topic_id < ( length( '1,2,3,4' ) - length( REPLACE ( '1,2,3,4', ',', '' ))+ 1 );