Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql查询中使用SELECT中的SELECT_Mysql_Sql_Database_Select - Fatal编程技术网

在mysql查询中使用SELECT中的SELECT

在mysql查询中使用SELECT中的SELECT,mysql,sql,database,select,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', 'tag

通常在
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')
  )
这导致“查询时间3-4s;锁定时间约0.000090s;检查约200行”的查询速度变慢

如果我拆分
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 <tablename>.tag IN ('tag1', 'tag2', 'tag3', 'tag4', 'tag5', 'tag6')
选择一些东西
发帖
tag_map.id=posts.id上的内部连接tag_map
内部联接标记
在标记上.tag\u id=tag\u map.tag\u id
其中.tag位于('tag1','tag2','tag3','tag4','tag5','tag6')

只需确保您只选择您需要的,而不使用*;还要说明在哪个表中有标记列,以便在MySQL中替换

,这样做的子查询是“相关查询”。这意味着外部
选择的结果取决于内部
选择的结果。结果是每行执行一次内部查询,这非常慢

你应该重构这个查询;无论您是加入两次查询还是使用两个查询,都是无关紧要的。加入两次会让你:

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', ...)
有关更多信息,请参阅上的MySQL手册


提示:
EXPLAIN SELECT
将向您展示优化器如何计划处理您的查询。如果看到
依赖子查询
,您应该重构,这些子查询的速度非常慢。

Join会过滤结果。第一个连接将保持满足第一个ON条件的结果,然后第二个条件将在第二个ON条件下给出最终结果

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 AND tags.tag IN ('tag1', 'tag2', 'tag3', 'tag4', 'tag5', 'tag6');
您可以看到有关堆栈溢出的以下讨论:

Join有助于降低时间复杂度并提高服务器的稳定性

有关将子查询转换为联接的信息:


选择中选择
?!这就像那部电影。。。Inselection。这就是我们所说的JOIN。是的,内部连接两次,至少我认为它比in子句快