代码之家  ›  专栏  ›  技术社区  ›  BMBM

重写查询以删除“在”集中的“查找”?

  •  2
  • BMBM  · 技术社区  · 14 年前

    我的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 . 芬德尼集 据我所知,不能使用索引,因此第二个联接需要对项目表进行完整的表扫描。是否可以在不更改数据库方案的情况下使用索引?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Matt S    14 年前

    在另一个字符串中搜索“字符串”。不管怎样,你都得做一次扫描。另一种使用索引实现此目的的优化方法是使用联接表。创建新表 showcase_projects 有列的 project_id showcase_id . 这将有一个记录的每一个联系之间的两个。

    现在,这个答案是基于我对这个查询中您的数据结构的原始理解。

        2
  •  0
  •   Tom Bartel    14 年前

    showcase.projects VARCHAR ?然后你可以用 REGEXP 这样地:

    ...
    INNER JOIN project ON
    showcase.projects REGEXP CONCAT('[[:<:]]', project.uid, '[[:>:]]')
    WHERE ...
    

    此表达式仅查找整词(括号结构分别标记左右词边界)。然而,我不确定这是否能够利用索引,也许有人能想出更聪明的方法。