我有一个包含10列的表,它包含大约800万行。我在这张桌子上做统计工作。问题是当我运行更多时间时,当id增长时,选择查询的速度会更慢
这是查询:
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 :(得分:1)
查询中的3个字段都已创建索引
Mysql在查询中每个表只能使用一个索引。如果您为每个字段创建了单独的索引,那么MySQL只能使用其中一个来加速查询,而不是全部3个。
我会在id, col_a, col_b
字段上创建一个多列索引(按此顺序)。这样,单个索引可用于满足where
条件和order by
中的所有3个条件。
每次循环后,我将再次使用新指针值
运行查询
您的代码建议您使用某种参数化查询,但我们无法确定它是否是正确的MySQL预处理语句。如果不是,那么请考虑在此过程中使用MySQL预处理语句。
在循环之前准备查询,然后在循环中调整参数,然后再次执行预准备语句。这样MySQL只会解析一次查询,而不是每次代码循环。