【发布时间】:2012-06-29 15:28:10
【问题描述】:
我有两张表,其中一张将 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
所以我看到很多时间都花在了发送数据上……我怎样才能加快这部分的速度?
【问题讨论】:
-
三个问题:1)
data_table.id和rating_table.id是同一个数据类型吗? 2) 除了索引id字段之外,您是否也索引了rating? 3) 您是否分析过该声明以查明持续时间是否不是由其他原因引起的(例如将数据发送回客户端)? -
创建索引。它将大大提高您的查询响应时间。
-
是的,我在问题中说 rating 已经有一个索引,并且两个表中的 id 具有相同的数据类型。我现在在 php myadmin 中运行它,所以时间实际上花在了 mysql 上。还有你所说的查询计划是什么意思?
-
MySQL 仅支持原始标准,但请参阅dev.mysql.com/doc/refman/5.6/en/execution-plan-information.html。查询计划是如何执行特定的 RA 操作:表扫描?哈希连接? [哪个] 使用了索引? (它还包含其他信息,如大小估计——错误的大小/基数估计会导致计划选择不当。)
-
只选择那些需要的列而不是 * 和评级?它是一列吗?使用 data_table.rating > 0 你能提供一些关于sqlfiddle.com的示例数据
标签: mysql optimization indexing query-optimization