我的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_projectsproject_id列的新表showcase_id。这将有一个记录,为每一个协会之间的两个。
现在这个答案是基于我对这个查询中的数据结构的初步理解。

09-11 20:25