Mysql select查询减慢大量行

Mysql select查询减慢大量行

问题描述:


我有一个包含10列的表,它包含大约800万行。我正在做这个表的统计工作。问题是当我运行更多的时间,当id增长时,选择查询减慢更多。
下面是该查询:
Mysql select查询减慢大量行

select * from transaction 
where id > :pointer 
AND col_a = :col_a 
AND col_b >= :from 
order by id ASC limit 5000 

查询3场的两个已创建索引。
每次循环后,我会用新的指针值再次运行查询,指针的值是前一结果集的最后一行的id,我不使用OFFSET。 最后,我花了半天的时间用这个查询来运行脚本,时间太长。
那么我该如何解决这个性能问题。

+0

您从哪种语言/环境运行您的查询? –

+0

你可以摆脱LIMIT并将它移动到WHERE子句,如下所示:id>:指针AND ID

+0

你有机会避免订单吗? – Patrick

在查询3个字段的两个已被创建的索引

MySQL能使用每个表中只有一个索引中的查询。如果你为每个字段创建了单独的索引,那么MySQL只能使用其中的一个来加速你的查询,而不是全部3.

我会在id, col_a, col_b字段(按此顺序)创建一个多列索引。通过这种方式,可以使用单个索引来满足where标准和order by中的所有3个条件。

每个循环之后,我会再与新指针值运行查询

你的代码,建议您使用某种parametrised查询的,但我们不能确定它是否是一个正确的MySQL准备好的语句。如果不是,那么可以考虑在这个过程中使用MySQL准备好的语句。

在循环前准备查询,然后在循环中调整参数,然后再次执行准备好的语句。这样MySQL只会解析查询一次,而不是每次代码循环。

+0

感谢您的回应,但添加多列索引并没有什么区别 – carboncrystal

+0

如果您可以添加SHOW CREATE TABLE事务并包含SHOW INDEX FROM事务,那么可能有人会提供帮助。 –