MYSQL需要更快的查询

时间:2012-06-28 06:22:29

标签: mysql optimization indexing query-optimization

我有两个表,其中一个表将id与评级相匹配,其中一个表中包含大约15列实际数据的ID。在数据表中,id列具有索引,在rating表中,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    

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

1 个答案:

答案 0 :(得分: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

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

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