php - MySQL 大型数据库查询速度慢

标签 php mysql sql

我有一个包含 IP 范围的表 ipaddresses。列是:ipStart、ipEnd

示例

ipStart: 3579374832
ipEnd: 3579374839

现在我想从另一个表中选择 300 个左右的 IP 地址:visit_count。基于这 300 个地址,我想检查 IP 地址是否在表 ipaddresses

中的任何 IP 范围内

我当前的代码:

$results = $database->query("SELECT user_id, 
                            DATE_FORMAT(last_visit, '%Y-%m-%d') as datumet, 
                            cookieId, ipaddress 
                          FROM `visit_count` 
                          WHERE last_visit BETWEEN 
                                      '$firstDayOfMonth' AND '$lastDayOfMonth' 
                          AND user_id = '$userId' 
                          GROUP BY cookieId 
                          ORDER BY last_visit ASC");        

$rows = $database->loadObjectList($results);    


foreach ( $rows as $row ) {

    $ipaddressLong = ip2long($row->ipaddress);

    // This is where its very very slow
    $selO = $database->query("SELECT ipStart, ipEnd FROM `ipaddresses` 
                        WHERE '$ipaddressLong' BETWEEN `ipStart` AND `ipEnd`");
    $rowO = $database->getrow($selO);

}

结果是一个非常慢的查询,消耗大量 CPU。

ipaddresses 具有 ipStartipEnd 的索引,包含大约 50k 行。

如何才能让这个过程更快?

最佳答案

使用 JOIN 对单个查询进行快速而肮脏的更改:-

SELECT a.ipStart, a.ipEnd 
FROM `ipaddresses` a
INNER JOIN
(
    SELECT user_id, DATE_FORMAT(last_visit, '%Y-%m-%d') as datumet, cookieId, inet_aton(ipaddress ) AS ipaddressLong
    FROM `visit_count` 
    WHERE last_visit BETWEEN '$firstDayOfMonth' AND '$lastDayOfMonth' 
    AND user_id = '$userId' 
    GROUP BY cookieId 
) b 
ON b.ipaddressLong BETWEEN a.ipStart AND a.ipEnd 

请注意,这可能可以简化。但是,这取决于您对 GROUP BY cookieId 的使用。目前,每个 cookie id 将获取一行,但哪一行未定义(即可以是与该 cookie id 相关的任何 user_id、IP 地址和上次访问日期)。

关于php - MySQL 大型数据库查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24200735/

相关文章:

MySql 选择并统计每天的数据数

php - 如何使用包含许多记录的php将arraylist从android发送到服务器(wamp)

MySQL使用 'where not exists'插入多行并且没有主键

php - Codeigniter 将新值设置为 db

php - 无法理解 PHP 中的 SOAP

php:计算某人在一个网站上停留多长时间并将数字插入数据库?

mysql - 将数据插入连接表

c# - c#中php的等效代码是什么

mysql - groupwise max 导致 sql_mode 错误

sql - 使用 3 个表连接获取 API 列表