gpt4 book ai didi

mysql - JOIN 查询非常慢

转载 作者:行者123 更新时间:2023-11-29 23:31:45 25 4
gpt4 key购买 nike

我有一个疑问:

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)

最佳答案

像这样进行地址查找的效率非常低。首先,您使用函数作为连接表达式,这意味着您无法使用索引,并且范围查询(尤其是 IP 地址)效率非常低。

在两个表中使用相同的数据类型会有所帮助。解决范围查找问题有两种解决方案:

1) 不使用任意网络范围的引用集,而是使用固定范围(例如 255.255.255.0 网络掩码)。这可以采用当前表之间 n:m 分解的形式,这也允许您保留不同的网络范围数据类型但使用索引。

这是一个相当笨拙的解决方案。

2) 将 IP 地址引用集保存在地理空间表中。请注意,虽然地址范围是一维空间,但 MySQL 地理空间数据库仅真正理解二维空间,因此您需要稍微修改一下空间 - 这很好地描述了 here

请注意,时间范围查找受到的影响较小,因为谓词的上限和下限是由表中的同一列定义的。

关于mysql - JOIN 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com