我有一个有10列的表,它包含大约800万行。我在用这张桌子做统计工作。问题是当我运行更多的时间,当id增长时,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。最后,我花了半天的时间运行这个查询的脚本,太长了。
那么我该如何解决这个性能问题呢?
发布于 2017-08-25 17:09:46
查询中的3个字段都已创建索引
Mysql在一个查询中每个表只能使用一个索引。如果您为每个字段创建了单独的索引,那么MySQL只能使用其中的一个来加快查询速度,而不是全部使用3个。
我将在id, col_a, col_b字段上创建一个多列索引(按此顺序)。这样,就可以使用单个索引来满足where标准和order by中的所有3个条件。
在每次循环后,我将使用新的指针值再次运行查询
您的代码建议您使用某种参数化查询,但我们无法确定它是否是正确的MySQL预准备语句。如果不是,则考虑对此过程使用MySQL预准备语句。
在循环之前准备查询,然后在循环中只需调整参数,然后再次执行准备好的语句。这样,MySQL将只解析查询一次,而不是每次代码循环。
https://stackoverflow.com/questions/45877771
复制相似问题