我正在使用mysql-workbench
和mysql
服务器在ubunt 18
具有 16 GB RAM 的机器。
我有一个名为 ips
的架构,和两个表,例如: table1
和table2
。
在 table1
和table2
有两个字段:ip
和description
, 位是字符串类型。我有很多记录。 table1
有 779938 条记录和 table2
有136657条记录。
我需要进行联合查询来查找 ip
的数量位于table2
有一个 description
以 str1%
开头并且不包含str2
并且不包含str3
。与此同时,那些ip
s 在 table1
中有描述不以 str1%
开头,并包含 str2
或str3
。
这是我的查询:
SELECT COUNT(`table2`.`ip`)
FROM `ips`.`table2`, `ips`.`table1`
WHERE `table2`.`ip` = `table1`.`ip`
AND (LOWER(`table1`.`description`) NOT LIKE 'str1%'
AND (LOWER(`tabl1`.`description`) LIKE '%-str2-%'
OR LOWER(`table1`.`description`) LIKE '%-str3-%'
)
)
AND (LOWER(`table2`.`description`) LIKE 'str1%'
AND LOWER(`table2`.`description`) NOT LIKE '%-str2-%'
AND LOWER(`table2`.`description`) NOT LIKE '%-str3-%'
);
但是,查询永远不会结束。持续时间有?
我从来没有得到结果。你能帮忙吗?
编辑:
这里是SHOW CREATE TABLE和
1) SHOW CREATE TABLE
ips .
表2 ;
CREATE TABLE `table2` (
`ip` varchar(500) DEFAULT NULL,
`description` varchar(500) DEFAULT NULL,
`type` varchar(500) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
2) SHOW CREATE TABLE
ips .
表1 ;
CREATE TABLE `table1` (
`ip` varchar(500) DEFAULT NULL,
`description` varchar(500) DEFAULT NULL,
`type` varchar(500) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
3) EXPLAIN <query>
# id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, SIMPLE, table2, , ALL, , , , , 136109, 100.00, Using where
1, SIMPLE, table1, , ALL, , , , , 786072, 10.00, Using where; Using join buffer (Block Nested Loop)
编辑2:
ip
的数据字段是以下格式的字符串:str.str.str.str
decription
字段的格式如下:str1-str2-str3-str4
最佳答案
之前有关索引的答案可能会优化查询。这可能是正确的。但很抱歉,我必须检查我用来解决问题的答案。感谢@Raymond Nijland 第一个指出索引问题,这让我想起了主键。
问题的根源是查询中的两个表都没有主键。主键必须是唯一且不为空的键。就我而言,我已经将 ip
字段准备好作为主键来服务器。由于我使用mysql-workbench
,我右键单击表,单击Alter Table
,然后检查适当字段的主键,如下所示:
这解决了我的问题。
关于mysql - 简单的SQL查询永远持续下去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52426665/