首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL查询太慢了,怎么改进呢?

问MySQL查询太慢了,怎么改进呢?
EN

Stack Overflow用户
提问于 2011-10-21 10:21:50
回答 2查看 1.5K关注 0票数 1

问题所在

我正在使用Workbench 5.2.35和MySQL服务器5.5运行一个查询,并且在查询600.516秒之后,我的错误"Error Code: 2013.在查询期间失去了与MySQL服务器的连接“--在查询中也发生了一些小小的更改。查询有两个角色:

  1. 选择一种特殊类型的记录,其特征是在“col1”中有“value1”(从阶段A传递到阶段B),
  2. 删除在“col2”中的值与下一个结果的“col2”中的值相同的记录(从B阶段传递到C阶段)。

第B阶段C**1 *A* *3 *C* *3 *C*A *2 *B*A *7 *C *3 *C*a *8*C*f* *16 *C*b *4 *A*a *9 *C *18 *C*c*c *5 *B*a *16 *C*b *6 *A*g *17 *C*b *7 *C*f *18 *C**c *8 *C*f *9 *C*f *10 *A *11 *B*f *12 *D*f *13 *S*f*F *15 *F*F *16 *C*b *17 *C*b *18 *C*c *

是对:MySQL, select rows where a parameter value depends on the value that it has in a different row的概括

查询是:

代码语言:javascript
复制
SELECT t.id, t.col2, t.col3, t.col4, t.col5 FROM tablename t
WHERE t.id < 1000000
    AND t.col1 = 'value1' 
    AND t.col2 <> 
    (SELECT col2 FROM tablename
        WHERE col1 = 'value1' 
        AND id > t.id 
        LIMIT 1);

错误的原因

现在,从本文https://serverfault.com/questions/29597/what-does-mysql-error-2013-mean中可以看出,此错误的原因是:

  1. KILLed
  2. 网络问题导致连接中断
  3. 服务器崩溃/死亡
  4. 您的连接为wait_timeout空闲并被杀死

H 118客户端没有足够快地为net_wait_timeout提取数据,并且被杀死H 219G 220

但是,由于查询以600.516秒结束,我想这个例子中的问题是4号(超时)。

可能存在的问题和解决办法

第一个想法是增加wait_timeout时间,但我认为这是由以前的错误触发的:查询只会继续运行,不会返回任何内容。极限t.id < 1000000准确地用于测试有限子集中的查询(数据库有大约2亿个条目),因此,我认为查询中存在一些问题,特别是在阶段B和阶段C之间的段落中(上一步是微不足道的)。

对于错误或查询的任何想法,我们将不胜感激。

谢谢

解决方案

这是工作代码,灵感来自最好的答案。命令的工作不同,但最后我使用了GROUP和ORDER,以便更好地显示结果。

代码语言:javascript
复制
SELECT id, col1, col2, ..., coln FROM tablename
    WHERE col1 = 'value1' 
    AND col2 = 'value2'
    ... 
    AND coln = 'valuen'
    GROUP BY col2
    ORDER BY id;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-21 13:28:44

SELECT DISTINCT Par FROM table_name

http://www.w3schools.com/sql/sql_distinct.asp

票数 0
EN

Stack Overflow用户

发布于 2011-10-21 10:48:06

我将使用not in重写它,查询优化器有一个特例。

另外,我还会用另一种方法将结果的数量限制在一个。

limit的问题在于,它首先创建了一个临时表,其中包含all结果,而不是从中选择1行。

代码语言:javascript
复制
SELECT t.id, t.col2, t.col3, t.col4, t.col5 
FROM tablename t
WHERE t.id < 1000000
    AND t.col1 = 'value1' 
    AND t.col2 NOT IN 
    (SELECT col2 FROM tablename
        WHERE col1 = 'value1' 
        AND id = t.id+1)    <<--- assuming that `id` is the primary key.

如果您有一个复合索引on (col1,col2),并且使用id作为主键,则查询不应该永远使用。

查看您的查询,我会将其重写为:

代码语言:javascript
复制
SELECT t.id, t.col2, t.col3, t.col4, t.col5 
FROM tablename t
WHERE t.id IN ( 
  SELECT t2.id 
  FROM tablename t2
  WHERE t2.col1 = 'value1'
  GROUP BY t.col2)

如果我正确地研究了各个阶段,这应该能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7848063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档