相关疑难解决方法(0)

加入与子查询

我是一个老派的MySQL用户,并且总是优先JOIN于子查询.但是现在每个人都使用子查询,我讨厌它; 我不知道为什么.

如果存在任何差异,我缺乏理论知识来判断自己.子查询是否与a一样好JOIN,因此没有什么可担心的?

mysql sql join subquery

780
推荐指数
14
解决办法
40万
查看次数

MySQL - SELECT WHERE字段IN(子查询) - 为什么这么慢?

我在数据库中有两个重复项,我想检查,所以我做了什么看到重复,我这样做:

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专家可以解释发生了什么吗?

mysql subquery where-in

124
推荐指数
5
解决办法
27万
查看次数

避免嵌套查询

避免嵌套查询有多重要.

我总是学会像瘟疫一样避免它们.但它们对我来说是最自然的事情.当我设计查询时,我写的第一件事是嵌套查询.然后我将它转换为连接,这有时需要很长时间才能正确.并且很少提供大的性能改进(有时它会)

所以他们真的很糟糕.有没有办法使用没有临时表和filesort的嵌套查询

mysql sql sql-server

18
推荐指数
1
解决办法
8473
查看次数

多个标签搜索查询

我正在进行基于标签的搜索.我有三个表标签(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)

对此有任何帮助真的很感激.

mysql

8
推荐指数
1
解决办法
5051
查看次数

SQL内连接与子查询

我正在研究以下查询:

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探查器调查这些查询,并发现了一些有趣的事实.

  • 查询1需要2.312秒
  • 查询2需要0.811秒
  • 查询3需要0.944秒

塔巴 48716行

TabB 62719行

基本上我要问的是为什么查询1需要很长时间,而不是查询3.我已经知道'子查询'比内连接慢,但这里查询2最快; 为什么?

sql sql-server sql-server-2008

7
推荐指数
1
解决办法
8719
查看次数

为什么MySQL JOIN明显快于WHERE IN(子查询)

我试图更好地理解为什么这个查询优化是如此重要(超过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)

更新:我在稍后进行了大量搜索之后在stackoverflow上发现了这个线程,其中涉及主题与联接的主题

mysql

5
推荐指数
1
解决办法
3996
查看次数

如何使用NHibernate检索List上的条件元素

我正在使用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语法做到这一点?

.net c# nhibernate

5
推荐指数
1
解决办法
4487
查看次数

在mysql查询中使用SELECT中的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查询,每个查询都会很快; 但这会增加不兼容高并发性的查询数量.

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

mysql sql database select

4
推荐指数
1
解决办法
4万
查看次数

从表 A 中获取不在表 B 中的记录

我是 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)

mysql sql logic

4
推荐指数
2
解决办法
2万
查看次数