2

我有以下查询来从 MySQL(所有 InnoDB)中选择用户及其位置等。该表user,每个大约有 200 万行,大约 250 行blocked_user,大约3500 行和大约 280 万行。blocked_countriescountriesregionscities

问题是查询非常快(0.05 秒),没有AND co.country_id='us'WHERE子句中。但是,我尝试了很多,但只是感觉肯定有一个更简单更好的方法来处理这个查询,不是吗?

我错过了什么?非常感谢任何帮助!非常感谢您!

4

2 回答 2

2

再次感谢你的帮助。最后,我找到了解决问题的方向。性能问题主要是由于范围扫描和ORDER BY ... LIMIT.

所以,我学到了很多关于索引的知识(对我来说是新的),并发现如果你有一个范围扫描(在我的例子中,年龄在 x 和 y 之间),那么范围列必须是连接索引中的最后一个,否则该索引不能完全使用。另外,用于对结果进行排序的列,必须在索引的最后。因此,考虑到范围扫描和 之间的混合ORDER BY,您需要决定是否应该使用索引进行排序或选择。

在我的情况下,这意味着要为几个索引考虑一些好的组合,其中要排序的剩余行只是极少数,或者如果搜索不能缩小到仅一些行,则将使用一个单独的索引进行排序然后查询将快速找到由 给出的行数LIMIT

于 2012-06-13T14:16:46.423 回答
1

尝试将 country_id 的 WHERE 更改为 HAVING

AND birthdate <=  '802726152'
AND birthdate >=  '676495752'

ORDER BY u.id DESC
HAVING co.country_id='us'
LIMIT 20
于 2012-06-10T13:36:56.267 回答