MySQL 查询跨 40,000 行 v/s 一次性加载和 for 循环



我有一个有 40,000 行的表。从代码端大约在同一秒,大约 20,000 个用户需要运行查询才能找到他们的相关行。这里有什么更好的方法?

加载缓存中的所有 40,000 行并对其运行 for 循环以查找记录?只需查询数据库。

下面是查询的外观。其中参数将是用户 IP。

SELECT * FROM iplist where ipfrom <= INET_ATON('xxx.xxx.xx.xx') limit 1;

MySQL已经以InnoDB缓冲池的形式缓存数据。当请求数据和索引页时,它们将被复制到 RAM,并用于任何后续查询。

如果尚未为搜索的列定义索引或主键,则应为该列定义索引:

ALTER TABLE iplist ADD INDEX (ipfrom);

然后,在该列中搜索特定值不需要表扫描,它将有效地缩小搜索范围。

请注意,当您使用 LIMIT 时,您还应该使用 ORDER BY,否则您得到的行将是按索引顺序读取的第一行,这可能并不总是您想要的。如果你冗余地使用 ORDERBY(即它读取索引的顺序相同(,那么它将被优化出来。

SELECT * FROM iplist where ipfrom <= INET_ATON(?) ORDER BY ipfrom LIMIT 1;

最新更新