2014-09-20 71 views
0

我有一个包含至少60,000行的表。我的查询仅仅是基本的,它是这样的:缓慢的SQL执行

SELECT `table`.name, `table`.age, `table`.points 
           FROM table 
           GROUP BY name, age 
           ORDER BY date 
           DESC 
           LIMIT 12 

结果是一样(12总计,查询花费1.2211秒),有时甚至还需要2秒只返回12行。

应该做些什么来使我的查询更快?

EXPLAIN QUERY:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
1  Extra  table ALL  NULL   NULL NULL  NULL 65704 Using temporary; Using filesort 
+0

如果你有性能问题,让MySQL [EXPLAIN](http://dev.mysql.com/doc/refman/5.6/en/explain.html)给你做什么工作。正如@SteelBrain所指出的那样:在很多情况下,索引对于提高性能非常重要。请添加您的表的EXPLAIN和CREATE TABLE语句的输出。 – VMai 2014-09-20 18:24:27

+0

并删除您的ORDER BY,这与此声明完全没有任何意义。 – VMai 2014-09-20 18:25:54

+0

请注意,“points”列中的值不是每个组的最新值。这是一个不确定的。请阅读[MySQL扩展到GROUP BY](http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html)。如果你不能在积分上使用聚合函数,那么你可以使用子选择或左连接。 – VMai 2014-09-20 18:32:45

回答

0

您可能希望创建SQL数据库索引。 如果你使用MySQL,你可以这样

ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME); 

对于您的情况下创建它们它会像:

ALTER TABLE `table` ADD INDEX (name); 
ALTER TABLE `table` ADD INDEX (age); 
ALTER TABLE `table` ADD INDEX (points); 

你也可能想看看this question

+0

关于(姓名,年龄)的综合指数可能是一个好主意。 – VMai 2014-09-20 18:21:51

+0

如果用户仅按名称搜索或仅按年龄搜索,组合索引“名称和年龄”是否会起作用? – 2014-09-20 18:25:27

+0

如果仅按名称搜索,它将起作用,但不能仅按年龄搜索。在这里我们有两个列的组合,所以它可以帮助。 – VMai 2014-09-20 18:28:37

1

这对于评论太长了。 日期索引将有所帮助,如果没有它,它将被强制执行表扫描。 另外什么是基数的名称,即不同名称的数量划分的行数?如果它低,你可以创建一个表,这些不同的名称和加入,旨在松散索引扫描。 对于开始尝试综合指数:

ALTER TABLE t1 ADD KEY indexName (name,age,date) 

有关详细信息把一个EXPLAIN查询之前的结果编辑你的问题。