MySQL跨40000行查询v/s一次性加载for循环

MySQL跨40000行查询v/s一次性加载for循环,mysql,sql,caching,Mysql,Sql,Caching,我有一张四万行的桌子。在同一时刻,大约20000名用户需要从代码端运行一个查询来查找他们的相关行。这里有什么更好的方法 在缓存中加载所有40000行并对其运行for循环以查找记录? 只需查询数据库 下面是查询的样子。其中参数将是用户IP SELECT * FROM iplist where ipfrom <= INET_ATON('xxx.xxx.xx.xx') limit 1; SELECT*FROM-iplist,其中ipfromMySQL已经以。在请求数据页和索引时,它们被复制到R

我有一张四万行的桌子。在同一时刻,大约20000名用户需要从代码端运行一个查询来查找他们的相关行。这里有什么更好的方法

在缓存中加载所有40000行并对其运行for循环以查找记录? 只需查询数据库

下面是查询的样子。其中参数将是用户IP

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

SELECT*FROM-iplist,其中ipfromMySQL已经以。在请求数据页和索引时,它们被复制到RAM中,并用于任何后续查询

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

ALTER TABLE iplist ADD INDEX (ipfrom);
然后,在该列中搜索特定值将不需要表扫描,它将有效地缩小搜索范围

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

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

从iplist中选择*,其中ipfrom不能使用此字段的主键。将有许多来自同一IP的条目。但是你的回答很好+1是的,我希望在这种情况下是这样,但我想提到完整性的主键。如果列已经是主键最左边的列,则不需要创建新索引。