我的mysql查询如下:
SELECT pages.*,
showcase.*,
project.*
FROM pages
INNER JOIN showcase ON showcase.pid = pages.uid AND showcase.deleted != 1
INNER JOIN project ON FIND_IN_SET(project.uid, showcase.projects)
WHERE pages.deleted != 1
AND pages.pid = 14
AND pages.dokType = 150
问题是第二个
INNER JOIN
-它使用FIND_IN_SET
,因为showcase(=项目集合)在字段showcase.projects
中将其项目存储为逗号分隔的列表。FIND_IN_SET
据我所知,不能使用索引,因此第二个连接需要对项目表进行完整的表扫描。有没有可能在不更改数据库方案的情况下使用索引? 最佳答案
你在另一个字符串中搜索“字符串”。不管怎样,你都得做一次扫描。使用索引进行此操作的另一个优化方法是使用联接表。创建一个包含showcase_projects
和project_id
列的新表showcase_id
。这将有一个记录,为每一个协会之间的两个。
现在这个答案是基于我对这个查询中的数据结构的初步理解。