【发布时间】:2014-10-23 09:34:31
【问题描述】:
我有一个问题:
EXPLAIN
SELECT i.ipStart, i.ipEnd, i.descr
FROM orgs i
JOIN visit_count v
on inet_aton(v.ipaddress) BETWEEN i.ipStart and i.ipEnd
WHERE v.last_visit BETWEEN '2014-10-10' AND '2014-10-22'
AND v.user_id = 1
随着我增加时间段,上述速度非常慢。以上大约需要 20 秒。
我的两个表模式:
`visit_count` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`visitCount` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`cookieId` varchar(50) NOT NULL,
`ipaddress` varchar(50) NOT NULL,
`last_visit` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `cookieId` (`cookieId`),
KEY `user_id` (`user_id`),
KEY `last_visit` (`last_visit`),
KEY `user_id_2` (`user_id`,`last_visit`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
`orgs` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`ipStart` bigint(100) DEFAULT NULL,
`ipEnd` bigint(100) DEFAULT NULL,
`land` varchar(250) DEFAULT NULL,
`descr` varchar(250) DEFAULT NULL,
`ipStartRead` varchar(250) DEFAULT NULL,
`ipEndRead` varchar(250) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `ipStart` (`ipStart`,`ipEnd`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
visit_count 大约有 160 万行
和
orgs 大约有 14k 行
有什么想法可以让这个过程更快吗?
编辑
解释:
+----+-------------+-------+-------+------------------------------+-----------+---------+------+-------+---------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------------------+-----------+---------+------+-------+---------------------------------------------------+
1 SIMPLE v range user_id,last_visit,user_id_2 user_id_2 9 NULL 357 Using index condition
1 SIMPLE i ALL NULL NULL NULL NULL 22068 Using where; Using join buffer (Block Nested Loop)
【问题讨论】:
-
可能是因为你加入了一个不能使用索引的函数调用。
-
@Strawberry 抱歉,现在包含它! :)
-
@juergend (像往常一样)是正确的。如果你存储并索引 inet_aton 值,这个查询会快很多。
-
在
ipaddress上添加了一个索引,但查询仍然和以前一样慢
标签: mysql performance