在where子句中优化包含函数的sql查询

时间:2016-05-20 09:36:01

标签: php mysql

我想检查数据库生成后是否存在IP。我的代码可以工作,但执行以下函数50,000次需要6秒钟。我在PHP 7(MySQL 5.7.11)上,但我将在生产中使用mariadb

如何修改sql以使其执行得更快

function ip_exist ($db,$ipv6_address) {

    $db->query("SELECT ipv6 FROM tbl_ipv6 WHERE ipv6 = inet6_aton(:ip)  LIMIT 1");
    $db->bind(':ip', $ipv6_address);
    $db->single();
    if ($db->rowCount() > 0) {
        return true;
    } 
    return false;
}

SQL

    CREATE TABLE `tbl_ipv6` (
      `ipv6` varbinary(16) NOT NULL,
      `email_id` varchar(255) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `tbl_ipv6`
  ADD PRIMARY KEY (`ipv6`);

表中没有行:4

更新2 查询变为以下(感谢Bernd Buffen)

$db->query("SELECT ipv6 FROM tbl_ipv6 WHERE ipv6 = inet6_aton(:ip)");

1 个答案:

答案 0 :(得分:1)

在此列上创建一个INDEX:

ALTER TABLE tbl_ipv6
ADD KEY (ipv6);

现在再试一次:

如果ips是唯一的,您可以将密钥设置为唯一。