mysql - 简单的SQL查询永远持续下去

标签 mysql sql database mysql-workbench

我正在使用mysql-workbenchmysql服务器在ubunt 18具有 16 GB RAM 的机器。

我有一个名为 ips 的架构,和两个表,例如: table1table2 。 在 table1table2有两个字段:ipdescription , 位是字符串类型。我有很多记录。 table1有 779938 条记录和 table2有136657条记录。

我需要进行联合查询来查找 ip 的数量位于table2有一个 descriptionstr1% 开头并且不包含str2并且不包含str3 。与此同时,那些ip s 在 table1 中有描述不以 str1% 开头,并包含 str2str3

这是我的查询:

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,然后检查适当字段的主键,如下所示:

enter image description here

这解决了我的问题。

关于mysql - 简单的SQL查询永远持续下去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52426665/

相关文章:

sql - 在 postgresql 中,是否可以使用 CREATE TABLE 上的触发器为表创建触发器?

sql - 对时间序列数据重新采样

java - 为什么我使用 DB2 LUW 和 WebSphere App Server 得到 SQLCODE=-204, SQLSTATE=42704?

php - 与 Doctrine Symfony 的条件关系

mysql - Mysql 中的 Md5 和 Salt

mysql - 加入 where 条件

mysql - 查询优化以查找随机样本

mysql - 如何从 Mysql 中的 DB 表中获取每个 classid 的计数,详见下文

MySQL:任何改进最佳匹配存储过程的建议

mysql - 使用 group by 和 order by 进行 mysql 查询