我是一个老派的MySQL用户,并且总是优先JOIN于子查询.但是现在每个人都使用子查询,我讨厌它; 我不知道为什么.
如果存在任何差异,我缺乏理论知识来判断自己.子查询是否与a一样好JOIN,因此没有什么可担心的?
我在数据库中有两个重复项,我想检查,所以我做了什么看到重复,我这样做:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
这样,我将获得所有具有related_field的行不止一次.此查询需要几毫秒才能执行.
现在,我想检查每个重复项,所以我想我可以在上面的查询中使用related_field选择some_table中的每一行,所以我喜欢这样:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Run Code Online (Sandbox Code Playgroud)
由于某种原因(这需要几分钟),结果显然是极慢的.究竟是什么让它变慢?related_field已编入索引.
最后我尝试从第一个查询创建一个视图"temp_view" (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1),然后再这样做我的第二个查询:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Run Code Online (Sandbox Code Playgroud)
这很好用.MySQL在几毫秒内完成此任务.
这里有任何SQL专家可以解释发生了什么吗?
避免嵌套查询有多重要.
我总是学会像瘟疫一样避免它们.但它们对我来说是最自然的事情.当我设计查询时,我写的第一件事是嵌套查询.然后我将它转换为连接,这有时需要很长时间才能正确.并且很少提供大的性能改进(有时它会)
所以他们真的很糟糕.有没有办法使用没有临时表和filesort的嵌套查询
我正在进行基于标签的搜索.我有三个表标签(id,name),tagXmedia(id,tag_id,media_id)和media(id,...).tagXmedia是标记和媒体表之间的映射表.这是一对多的关系.
我真的可以在如何创建"AND"类型的搜索方面使用一点方向.例如,我需要能够在媒体表中搜索与"home"和"hawaii"标签相关联的条目.
我已经尝试过MySQL等存在
SELECT
tam.media_id
FROM
tagXmedia tam
LEFT JOIN tag ON tag.id = tam.tag_id
WHERE
EXISTS (SELECT * FROM tag WHERE tag.name = "home")
AND EXISTS (SELECT * FROM tag WHERE tag.name = "hawaii")
Run Code Online (Sandbox Code Playgroud)
对此有任何帮助真的很感激.
我正在研究以下查询:
Query 1: SELECT * From TabA INNER JOIN TabB on TabA.Id=TabB.Id
Query 2: SELECT * From TabA WHERE Id in (SELECT Id FROM TabB)
Query 3: SELECT TabA.* From TabA INNER JOIN TabB on TabA.Id=TabB.Id
Run Code Online (Sandbox Code Playgroud)
我使用SQL Server探查器调查这些查询,并发现了一些有趣的事实.
塔巴 48716行
TabB 62719行
基本上我要问的是为什么查询1需要很长时间,而不是查询3.我已经知道'子查询'比内连接慢,但这里查询2最快; 为什么?
我试图更好地理解为什么这个查询优化是如此重要(超过100倍),所以我可以重用其他查询类似的逻辑.
使用MySQL 4.1 - 在所有查询和结果时间可以一致地再现之前,重置QUERY CACHE和FLUSH TABLES.在EXPLAIN上,对我来说唯一明显的事情是在JOIN期间只需要找到5行?但这是速度的全部答案吗?两个查询都使用部分索引(forum_stickies)来确定已删除的主题状态(topic_status = 0)
使用EXPLAIN进行更深入分析的屏幕截图
慢查询:0.7+秒(缓存清除)
SELECT SQL_NO_CACHE forum_id, topic_id FROM bb_topics
WHERE topic_last_post_id IN
(SELECT SQL_NO_CACHE MAX (topic_last_post_id) AS topic_last_post_id
FROM bb_topics WHERE topic_status=0 GROUP BY forum_id)
Run Code Online (Sandbox Code Playgroud)
快速查询:0.004秒或更短(缓存清除)
SELECT SQL_NO_CACHE forum_id, topic_id FROM bb_topics AS s1
JOIN
(SELECT SQL_NO_CACHE MAX(topic_last_post_id) AS topic_last_post_id
FROM bb_topics WHERE topic_status=0 GROUP BY forum_id) AS s2
ON s1.topic_last_post_id=s2.topic_last_post_id
Run Code Online (Sandbox Code Playgroud)
请注意,最重要的列(topic_last_post_id)上没有索引,但无法帮助(无论如何都会存储结果以供重复使用).
答案只是因为第一个查询必须扫描topic_last_post_idTWICE,第二次将结果与子查询匹配?如果是这样,为什么它会指数速度变慢?
(不太重要我很好奇为什么第一个查询仍然需要这么长时间,如果我确实做了一个索引topic_last_post_id)
我正在使用NHibernate,我有两个映射我的DataBase模式的类:
public class A
{
public virtual int Id { get; set;}
public virtual List<B> MyList { get; set; }
}
public class B
{
public virtual int Id { get; set; }
public virtual DateTime Date { get; set; }
public virtual A FKtoA { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想得到表A的所有条目,它们的MyList属性的所有元素都具有小于给定值的Date.
我怎么能用优雅的NHibernate语法做到这一点?
通常使用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查询,每个查询都会很快; 但这会增加不兼容高并发性的查询数量.
这是通常的情况,还是我的编码有问题?
我是 SQL 新手,还无法正确执行此 SQL 查询。我目前有:
SELECT * FROM tableA
LEFT OUTER JOIN tableB
ON tableA.`full_name` = tableB.`full_name`
WHERE tableB.`id` IS NULL
Run Code Online (Sandbox Code Playgroud)
两个表都有人员记录,包括姓名和地址。我需要获取 tableA 中那些人的所有记录,而不是 tableB。下图基本上是我需要的:

问题是两个人可能有相同的名字,但地址不同。所以最终,我需要获取 tableA 中所有人的记录,不包括具有重复名称和地址的重复项。
每个表都有如下列:
id,full_name,first_name,last_name,title,phone,address,city,state,postal_code
Run Code Online (Sandbox Code Playgroud)