2011-07-15 55 views
1

我有以下查询:MySQL查询优化

SELECT * 
    FROM posts USE INDEX(abc) 
WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
LIMIT 10; 

INDEX(ABC)是一个柱,b和c的索引。

查询一直运行良好,直到最近数据库变大时为止。它现在有大约1000万行。

我一直在试图找到替代方案来优化它,但没有取得太大的成功。我希望有人能给我一些线索。谢谢。

顺便说一句,我的表引擎是innodb。

+0

您能否介绍一下这些条件是如何产生的? –

+0

@Dan:将d和e添加到索引中将是无用的,因为它必须执行完整扫描,因为列c的查询不是绝对的。 – Vern

+0

@Sam:这个查询是生成相关的帖子,类似于where category = 3,group = 123,domain> 4012,articleID> 5212300和writer!= 661. – Vern

回答

1

我将通过删除您正在使用的索引提示开始我的优化。查询优化器在猜测什么是您的查询的最佳执行计划方面做得相当不错,并且在长期运行中提供索引提示通常会对查询性能产生负面影响。

SELECT * 
    FROM posts 
WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
LIMIT 10; 

我也认为在bcdea,独立的索引可以帮助,因为查询规划将能够结合索引来解析查询。 (不确定MySQL,但PostgreSQL能够将它们结合起来解决查询,如果有帮助的话)。

+0

我不认为独立的索引可以提供帮助。看看这篇文章:http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge/ – Vern

+0

我刚刚尝试删除索引提示。这不好。所有查询突然堵塞进程列表。 :( – Vern

+0

@Vern:确实非常有趣的链接。非常感谢分享! –