在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子句快