如果在TABLE2逗号分隔列上找到TABLE1 ID,我想执行select.
table1:
+---------+
| id |
+---------+
|12345678 |
+---------+
|12322222 |
+---------+
table2:
+---------------------------------------------+
| manyids |
+---------------------------------------------+
|12345678,1111111,2222233,0000111,65321 |
+---------------------------------------------+
|2222233,12322222 |
+---------------------------------------------+
|12322222 |
+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
这在较小的测试表上工作正常:
SELECT table1.id,
COUNT(table1.id) AS occurences
FROM table1 JOIN table2 ON FIND_IN_SET(table1.id, table2.manyids ) > 0
GROUP BY table1.id HAVING occurences > 0
ORDER BY occurences DESC
Run Code Online (Sandbox Code Playgroud)
但是实际的TABLE1我想执行select有超过500k行而FIND_IN_SET太慢了.任何替代品?
唯一明智的 选择是规范化表格:
例
table tag
---------
id integer auto_increment primary key
name varchar(40)
table article
-------------
id integer auto_increment primary key
title varchar(1000)
content text
table tag_link
--------------
article_id integer foreign key references article(id)
tag_id integer foreign key references tag(id)
primary key article_id, tag_id
Run Code Online (Sandbox Code Playgroud)
因为所有字段都已编制索引,所以您可以轻松快速地进行查询,如下所示:
SELECT t.name FROM article AS a
INNER JOIN tag_link tl ON (tl.article_id = a.id)
INNER JOIN tag t ON (t.id = tl.tag_id)
WHERE a.id = '45785'
Run Code Online (Sandbox Code Playgroud)
选项2坏主意,比选项1差很多
如果你真的无法改变设置,请fulltext在字段上创建索引manyids.
并将查询更改为:
SELECT table1.id,
COUNT(table1.id) AS occurences
FROM table1
JOIN table2 ON MATCH(table2.manyids)
AGAINST (CONCAT("+'",table1.id,"'") IN BOOLEAN MODE)
/*boolean mode is required*/
GROUP BY table1.id HAVING occurences > 0
ORDER BY occurences DESC
Run Code Online (Sandbox Code Playgroud)
如果任何id在禁用词列表中,它将不匹配.请注意,此列表中没有数字.
链接
http://dev.mysql.com/doc/refman/5.5/en/fulltext-stopwords.html
http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
请注意,您需要调整全文索引考虑的最小和最大字长:请参阅:http://dev.mysql.com/doc/refman/5.5/en/fulltext-fine-tuning.html