1

我有两张表,其中一张将 id 与评级相匹配,其中一张的 id 包含大约 15 列中的实际数据。在数据表中,id 列有一个索引,在评级表中,id 是主键,评级是索引的。我想选择数据,但只能从具有正面评价的行中选择。为此,我正在使用查询

SELECT * FROM data_table 
  INNER JOIN rating_table ON data_table.id = rating_table.id
  WHERE rating > 0

但由于某种原因,这大约需要 0.35 秒,这对我来说似乎长。数据表中大约有 90,000 行,而评级表中大约有 5,000 行,这需要花费的时间甚至不到十分之一秒……我怎样才能以不同的方式索引或以不同的方式查询来加快这项任务?

编辑: 分析后它给了我以下信息。请注意,我认为它已被缓存,因此查询返回的速度比以前快得多,但即便如此,这可能对某人有用

0.000012 starting   
0.000053 checking query cache for query     
0.000014 Opening tables     
0.000006 System lock    
0.000027 Table lock     
0.000044 init   
0.000018 optimizing     
0.000060 statistics     
0.000016 preparing  
0.000004 executing  
0.004916 Sending data   
0.000007 end    
0.000003 query end  
0.002271 freeing items  
0.000009 storing result in query cache  
0.000002 logging slow query     
0.000004 cleaning up    

所以我看到很多时间都花在发送数据上……我怎样才能加快这部分的速度?

4

1 回答 1

3

您的问题没有确切的解决方案,但在没有看到实际表结构的情况下提供一些建议:正确分析您的查询。

MySQL 有一个内置分析器,它允许您非常详细地查看查询的哪一部分花费了多少时间。

在您的情况下,请按照下列步骤操作:

(1) 执行您的查询。

(2) 找出用于分析的查询 id:

SHOW PROFILES;

它会返回给你这样的东西:

Query_ID |  Duration | Query
---------+-----------+-----------------------
   2     | 0.0006200 | SHOW STATUS
   3     | 0.3600000 | (your query here)
  ...    | ...       | ...

现在您知道查询 id 是 (3)。

(3) 分析查询。

SHOW PROFILE FOR QUERY 3;   // example 

这将返回您的详细信息,可能如下所示:

Status                          | Duration
--------------------------------+-------------------
starting                        | 0.000010
checking query cache for query  | 0.000078
Opening tables                  | 0.000051
System lock                     | 0.000003
Table lock                      | 0.000008
init                            | 0.000036
optimizing                      | 0.000020
statistics                      | 0.000013
preparing                       | 0.000015
Creating tmp table              | 0.000028
executing                       | 0.000602
Copying to tmp table            | 0.000176
Sorting result                  | 0.000043
Sending data                    | 0.080032
end                             | 0.000004
removing tmp table              | 0.000024
end                             | 0.000006
query end                       | 0.000003
freeing items                   | 0.000148
removing tmp table              | 0.000019
closing tables                  | 0.000005
logging slow query              | 0.000003
cleaning up                     | 0.000004

在这个例子中,大部分时间实际上是花在将数据从服务器发送回客户端。

如果您已完成此操作,可能会更新您的问题以显示结果。也许还可以添加数据结构。

于 2012-06-28T06:44:49.307 回答