在mysql查询中使用SELECT中的SELECT

Goo*_*bot 4 mysql sql database select

通常使用SELECT内部SELECT来减少查询的数量; 但是当我检查这会导致查询速度变慢(这显然对mysql性能有害).我有一个简单的查询

SELECT something
 FROM posts
 WHERE id IN (
  SELECT tag_map.id
  FROM tag_map
  INNER JOIN tags
  ON tags.tag_id=tag_map.tag_id
  WHERE tag IN ('tag1', 'tag2', 'tag3', 'tag4', 'tag5', 'tag6')
  )
Run Code Online (Sandbox Code Playgroud)

这导致查询"查询时间3-4s;锁定时间约为0.000090s;检查约200行"的查询速度慢.

如果我拆分SELECT查询,每个查询都会很快; 但这会增加不兼容高并发性的查询数量.

这是通常的情况,还是我的编码有问题?

Int*_*ang 13

在MySQL中,执行这样的子查询是"相关查询".这意味着外部SELECT的结果取决于内部的结果SELECT.结果是你的内部查询每行执行一次,这非常慢.

你应该重构这个查询; 您是否加入两次或使用两个查询大多无关紧要.加入两次会给你:

SELECT something
FROM posts
INNER JOIN tag_map ON tag_map.id = posts.id
INNER JOIN tags ON tags.tag_id = tag_map.tag_id
WHERE tags.tag IN ('tag1', ...)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅有关将子查询转换为JOIN的MySQL手册.

提示:EXPLAIN SELECT将向您展示优化程序如何计划处理您的查询.如果你看到DEPENDENT SUBQUERY你应该重构,这些都是非常慢的.