我正在尝试搜索客户端的IP,然后搜索所有这些IP以获取更多客户端。基本上,我正在尝试查看客户端是否与任何其他客户端共享IP地址。
我遇到的问题是,无论操作的数据大小如何,查询都需要25-30秒。我想知道是否有更有效的查询或表设置。我们目前在此表中有超过6,300,000行。
我目前的查询是:
select * from client_ip
where ip in(
select ip from client_ip
where id = "6" and last_login > "2017-04-26"
)
此查询将获取客户端ID 6的IP并查找所有这些IP并列出它们出现的行。输出的选择列表是客户端和其他具有相同IP的客户端的IP。
示例结果:
client_ip
的表格视图:
此表记录了一个新行,其中包含用户id
,ip
,last_login
日期和count
(他们在该IP上的次数)。这意味着记录了客户端使用的每个IP。
正如我上面所说,我想知道是否有更有效的查询或表格设置来加快查询时间。
(来自评论)
CREATE TABLE player_ip (
id INT(11) NOT NULL,
ip VARCHAR(15) NOT NULL,
last_login TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
count INT(11) NOT NULL,
PRIMARY KEY (ip, id),
UNIQUE INDEX UNIQUE (ip, id)
) COLLATE='utf8_general_ci' ENGINE=InnoDB ;
感谢任何帮助,谢谢。
答案 0 :(得分:2)
id,ip,last_login是否计算client_ip
中的列?如果不是请提供SHOW CREATE TABLE client_ip
。
SELECT b.id, b.ip, b.last_login, b.count
FROM client_ip AS a
JOIN client_ip AS b ON a.ip = b.ip
WHERE a.id = "6"
AND a.last_login >= "2017-04-26";
作为一般规则,请避免IN ( SELECT ... )
;把它变成JOIN
。 (在这种情况下“自我加入”。)
你需要
INDEX(id, last_login)
INDEX(ip)
(CREATE TABLE
将帮助我避免与现有索引冲突。)