加快IP查找的双/嵌套选择查询

时间:2017-05-27 03:55:38

标签: mysql performance database-design

我正在尝试搜索客户端的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。

示例结果:

Results

client_ip的表格视图:

Table view

此表记录了一个新行,其中包含用户idiplast_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 ; 

感谢任何帮助,谢谢。

1 个答案:

答案 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将帮助我避免与现有索引冲突。)