2011-02-22 41 views
4

我已经创建了一个sql表,我在磁盘上创建了索引文件。 桌上有超过100万条记录。 我已经添加了ext和size的索引,但是它仍然需要一分钟才能执行这个查询,它告诉我ext使用的空间量。 如何提高此选择的性能?mysql:我该如何提高这个mysql select语句的性能

select ext, 
    ROUND((sum(size)/(1073741824))) as TotalSizeGB, 
    count(*) as Count 
    from fileindex 
group by ext 
order by TotalSizeGB desc; 

Explain输出:

|| *id* || *select_type* || *table* || *type* || *possible_keys* || *key* || *key_len* || *ref* || *rows* || *Extra*          || 
|| 1 || SIMPLE  || fileindex || index || _NULL_   || ext || 27  || _NULL_ || 1892234 || Using index; Using temporary; Using filesort || 
+0

你能告诉我们的查询计划吗?使用EXPLAIN http://dev.mysql.com/doc/refman/5.5/en/explain.html – 2011-02-22 18:41:19

+0

我不认为你可以改善它,因为它加载**全部**表中的数据。 – Augusto 2011-02-22 18:49:53

+0

@augusto除非在`ext`上缺少可用于执行分组的索引 – 2011-02-22 18:52:01

回答

2

写入的查询总是会打到表中的每一行 - 所以确实有一个限制它能够执行的速度。如果你真的希望这个结果很快返回,你可能想要添加另一个表来保持每个ext的总大小,并且每当在主表上进行操作时用触发器更新它。

0

因为我看不到任何明显的缺陷与你的MySQL语法,如果你想让它比快,我会建议去NoSQL的,并使用一个数据库文件支持Map-Reduce,如HadoopCouchDB。你可以在EC2上的群集(读取数百个)机器上承载这个(好吧,我在开玩笑,但是认真你可以在1个机箱上为每个CPU核心运行1个节点来实现最大速度)。

0

您的查询将打击表中的每条记录,因此您不希望通过首先触击索引然后触击表来减慢速度,显然这将导致表中每个记录有2个IO( 1为索引,1为实际表格数据)。

因此,第一个问题变成如何加快全表扫描?

Tune IO。你的磁盘是否快速,碎片整理,不共享(与其他数据,应用程序等),等等。

等等,考虑denormalisation;例如表格上的触发器,用于统计每个插入,更新和删除时的适当数据并将其存储在另一个表中。然后查询另一个表中的单行数据。

2

使用MySQL Triggers以便将行插入到fileindex中,它执行类似UPDATE meta SET value=value+NEW.size WHERE name='fileindex.count';的操作。

delimiter | 

DROP TRIGGER fileindexafterinsert;| 
CREATE TRIGGER fileindexafterinsert AFTER INSERT ON fileindex 
    FOR EACH ROW BEGIN 
     update meta set value=value+NEW.size where name=CONCAT('fileindex.',NEW.ext); 
    END; 
| 
DROP TRIGGER fileindexafterdelete;| 
CREATE TRIGGER fileindexafterdelete AFTER DELETE ON fileindex 
    FOR EACH ROW BEGIN 
     update meta set value=value-OLD.size where name=CONCAT('fileindex.',OLD.ext); 
    END; 
| 

然后,你只需要做SELECT * FROM meta WHERE name='fileindex.exe' LIMIT 1应该返回小于0.01秒。

0

添加一个覆盖索引,它基本上包含您在内存中需要的所有列。 我会推荐:alter table fileindex add index covering (ext,TotalSizeGB, size)

应该很好。 (希望)