有没有一种更快的方法来搜索在另一个表中有记录的记录?

时间:2019-08-26 15:14:43

标签: mysql

我想知道是否有更有效的方法来找到我要的东西。

项目具有统计信息 统计信息存储在与item_id链接的单独表中。 一个项目将具有多个统计信息。

要删除具有特定统计信息的项目,我的代码会生成如下所示的SQL语句来查找这些项目。

SELECT *
FROM 
  (SELECT *
   FROM 
    (SELECT *
     FROM 
      (SELECT *
       FROM items
       WHERE items.item_type = :item_type
         AND items.power_level < :power_level
         AND items.power_level > :power_level_lowest) AS i
     WHERE EXISTS (
       SELECT id
       FROM item_stat
       WHERE item_stat.stat_id = :stat_1
       AND i.id = item_stat.item_id)
   ) AS i1 
   WHERE EXISTS (
     SELECT id
     FROM item_stat
     WHERE item_stat.stat_id = :stat_2
       AND i1.id = item_stat.item_id)
) AS i2  
WHERE EXISTS (
  SELECT id
  FROM item_sta
  WHERE item_stat.stat_id = :stat_3
    AND i2.id = item_stat.item_id)
ORDER BY power_level DESC;

是否有一种更快的方法来搜索另一个表中具有特定统计信息的项目,因此项目中大约有50万条记录。每个item_type介于50-80k之间,每个统计总计4-7。但搜索只需要验证一个项目具有1-4。

我正在使用MariaDB托管这些记录。该查询的工作时间比我想要的还要长。

要阐明要求: 有许多物品,其统计数据各不相同。 我想找到所有按功率级别排序的项目,这些项目必须至少包含指定的特定统计信息。

项目必须具有统计信息,但包含更多统计信息。现在,我正在使用一个单独的查询来检索完整的数据。

1 个答案:

答案 0 :(得分:1)

您的查询不是很清楚,我可能误解了您的问题。但是据我了解,我认为您只需执行几个JOIN操作就可以完成您想做的事情:

SELECT items.*
FROM items
  JOIN item_stat AS stat1
    ON stat1.stat_id = :stat_1
    AND stat1.item_id = items.id
  JOIN item_stat AS stat2
    ON stat2.stat_id = :stat_2
    AND stat2.item_id = items.id
  JOIN item_stat AS stat3
    ON stat3.stat_id = :stat_3
    AND stat3.item_id = items.id
WHERE items.item_type = :item_type
  AND items.power_level < :power_level
  AND items.power_level > :power_level_lowest
ORDER BY items.power_level DESC;

如果这不能按您希望的那样工作,您能否用一些itemsitem_stat数据示例以及预期结果来更新您的问题?