mysql查询优化

mysql查询优化,mysql,optimization,query-optimization,Mysql,Optimization,Query Optimization,我有以下疑问: SELECT * FROM posts USE INDEX(abc) WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 LIMIT 10; 索引(abc)是a、b和c列的索引 直到最近,当数据库变得很大时,这个查询一直运行良好。它现在有大约1亿行 我一直在努力寻找替代方案来优化它,但没有取得多大成功。我希望有人能给我一些线索。谢谢 顺便说一句,我的表引擎是innodb。我将从删除您正在使用的

我有以下疑问:

SELECT * 
  FROM posts USE INDEX(abc) 
 WHERE a=3 and b=123 and c>4012 and d>5212300 and e!=661 
 LIMIT 10;
索引(abc)是a、b和c列的索引

直到最近,当数据库变得很大时,这个查询一直运行良好。它现在有大约1亿行

我一直在努力寻找替代方案来优化它,但没有取得多大成功。我希望有人能给我一些线索。谢谢


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

我将从删除您正在使用的索引提示开始优化。查询优化器在猜测查询的最佳执行计划方面做得很好,从长远来看,提供索引提示通常会对查询性能产生负面影响

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

我还认为,列
a
b
c
d
e
上的独立索引可能会有所帮助,因为查询计划器将能够组合索引来解决查询。(不确定是否使用MySQL,但如果有帮助的话,PostgreSQL可以将它们结合起来解决查询)。

我将通过删除您正在使用的索引提示开始优化。查询优化器在猜测查询的最佳执行计划方面做得很好,从长远来看,提供索引提示通常会对查询性能产生负面影响

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

我还认为,列
a
b
c
d
e
上的独立索引可能会有所帮助,因为查询计划器将能够组合索引来解决查询。(不确定MySQL,但如果有帮助,PostgreSQL可以将它们结合起来解决查询).

您能告诉我们这些条件是如何生成的吗?@Dan:将d和e添加到索引中是没有用的,因为它必须进行完整扫描,因为对c列的查询不是绝对的。@Sam:此查询是生成相关的帖子,比如category=3,group=123,domain>4012,articleID>5212300和writer!=661.请将解释结果和表格结构发布为well@Vern我可能错了,但根据你的解释,b在这张表中似乎比a更独特。所以,如果这是真的,那么您可以尝试索引(b,a,c)。顺便说一句,我不太相信将d添加到索引中是没有用的,因为您将结果限制为仅10行。您能告诉我们这些条件是如何生成的吗?@Dan:将d和e添加到索引中是没有用的,因为它必须进行完整扫描,因为对c列的查询不是绝对的。@Sam:此查询就是生成相关的帖子,比如category=3、group=123、domain>4012、articleID>5212300和writer!=661.请将解释结果和表格结构发布为well@Vern我可能错了,但根据你的解释,b在这张表中似乎比a更独特。所以,如果这是真的,那么您可以尝试索引(b,a,c)。顺便说一句,我不太相信在索引中添加d是没有用的,因为您将结果限制为仅10行。我不认为独立的索引可以起到帮助作用。看看这篇文章:我刚刚尝试删除索引提示。这很糟糕。所有的查询突然阻塞了进程列表:(@Vern:链接的确非常有趣。非常感谢分享!我认为独立索引没有帮助。请看这篇文章:我刚刚尝试删除索引提示。这很糟糕。所有查询突然阻塞了进程列表。:(@Vern:链接的确非常有趣。非常感谢分享!