MYSQL需要更快的查询

MYSQL需要更快的查询,mysql,optimization,indexing,query-optimization,Mysql,Optimization,Indexing,Query Optimization,我有两个表,其中一个表将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秒,这对我来说似乎很长。数据表

我有两个表,其中一个表将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秒,这对我来说似乎很长。数据表中约有90000行,评级表中约有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    

所以我看到很多时间都花在发送数据上。。。如何加快这一部分的速度?

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

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

在您的情况下,请遵循以下步骤:

1执行您的查询

2查找用于分析的查询id:

SHOW PROFILES;
它将返回如下内容:

Query_ID |  Duration | Query
---------+-----------+-----------------------
   2     | 0.0006200 | SHOW STATUS
   3     | 0.3600000 | (your query here)
  ...    | ...       | ...
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
现在您知道查询id是3

3.分析查询

SHOW PROFILE FOR QUERY 3;   // example 
这将返回详细信息,可能如下所示:

Query_ID |  Duration | Query
---------+-----------+-----------------------
   2     | 0.0006200 | SHOW STATUS
   3     | 0.3600000 | (your query here)
  ...    | ...       | ...
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
在本例中,大多数时间实际上是将数据从服务器发送回客户端


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

三个问题:1.数据表id和评级表id是否属于同一数据类型?2除了索引两个id字段外,您是否也索引了评级?3您是否对语句进行了分析,以确定持续时间是否不是由其他因素造成的,如将数据发送回客户端?创建索引。这将大大提高您的查询响应时间。是的,我在问题中说过,rating已经有了一个索引,并且两个表中的ID具有相同的数据类型。我现在在php myadmin中运行它,所以时间实际上花在了mysql上。您所说的查询计划是什么意思?MySQL只支持原始标准,但请参见。查询计划是如何执行特定RA操作的:表扫描?散列加入?使用[哪个]索引?它还包含其他信息,如大小估计值-错误的大小/基数估计值可能会导致较差的计划选择。请仅选择需要的列,而不是*以及评级中的哪些列?是专栏吗?使用data_table.rating>0你能提供一些关于ok的示例数据吗?我刚刚发布了结果,但我认为它被缓存了,因为这一次返回的速度要快得多。它仍然可能有用。感谢您告诉我这一点,我以前从未使用过探查器。请在执行查询之前重置查询缓存,否则我们只能看到它从缓存接收到数据:重置查询缓存@黑客艺术家,请记住发送数据实际上是非常具有欺骗性的。这不仅仅是将数据发送到客户端所花费的时间。这是从读取第一行到完成将最后一行发送到客户端的时间。换句话说,将数据发送到客户端所花费的时间可能少于该值的1%。