2012-06-28 144 views
1

我有两个表,其中一个匹配评级的id,其中一个id为15个实际数据的id。在数据表中,id列有一个索引,并且在收视表中,id是主键,并且评级被索引。我想选择数据,但只能从具有正评级的行中选择数据。这样做,我使用的查询MYSQL需要一个更快的查询

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

但由于某种原因,这是服用约0.35秒,这似乎很长我。数据表中大约有90,000行,评级表中大约有5000行,这需要比甚至十分之一秒还要少得多......我如何以不同的方式进行索引或以不同的方式进行查询以加快此任务的速度?

编辑: 分析后,它给了我以下。请注意,我认为这是缓存,以便查询回来的速度远远超过以前,但即使如此,这可能是有人

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  

让我看到了很多的时间用在发送数据花在有用的......怎么能我加速这部分?

+2

三个问题:1)相同数据类型的'data_table.id'和'rating_table.id'是否相同? 2)除了索引'id'字段,你是否也编制了'rating'的索引? 3)你是否对该陈述进行了简要分析,以确定持续时间是否不是由其他事情引起的(如将数据发送回客户端)? – Bjoern

+0

创建索引。这将大大提高查询响应时间。 –

+0

是的,我在问题中说过评分已经有一个索引,两个表中的ID都是相同的数据类型。我现在在php myadmin中运行这个,所以这个时间实际上是在mysql中使用的。你也是什么意思的查询计划? – hackartist

回答

3

没有确切的解决方案给你的问题,但一些建议没有看到实际的表结构:正确地配置您的查询。

MySQL有一个inbuild分析器,它可以让你查看非常详细的查询部分查询花了多少时间。

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

(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 

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

如果你已经这样做了,也许更新你的问题来显示结果。也可以添加数据结构。

+0

好吧我刚刚发布了结果,但我认为它被缓存了,因为这次它回来得快得多。它仍然可能是有用的。谢谢你告诉我这件事我之前从未使用过轮廓仪。 – hackartist

+0

请在执行查询之前重置查询缓存,否则我们只会看到它从缓存中收到数据:'RESET QUERY CACHE;' – Bjoern

+2

@hackartist,请记住'发送数据'实际上非常具有欺骗性。这不仅仅是将数据发送给客户的时间。从阅读第一行开始直到完成将最后一行发送给客户端。换句话说,将数据发送到客户端所花费的时间**可以小于该值的1%。 – Adi