MySQL 查询耗时较长。我尝试了多种查询变体,但似乎没有任何影响速度

标签 mysql sql join

这是我的查询和结构数据:

   SELECT * 
     FROM gmm_sql as a
LEFT JOIN usds as b ON a.dp_id = b.dp_id
LEFT JOIN usdsown as c ON b.dp_id = c.dp_id 
    WHERE a.comm like '%tree%'
  • gmm_sql: 21 个字段。所有字段 varchar() 从 20 到 255 混合。4,882 条记录。
  • usds: 7 个字段。所有字段 varchar() 从 20 到 255 混合。304,713 条记录。
  • usdsown: 14 个字段。所有字段 varchar() 混合 20 - 255。107,606 条记录。

我已经手动确认有匹配项。我正在使用 MySQL Workbench 来运行这些查询测试。查询只持续运行 10 分钟并且不会停止...

我做错了什么吗?

这是一个 EXPLAIN 输出:

id  select_type table   type    possible_keys   key key_len ref rows    Extra 
1   SIMPLE  a   ALL NULL    NULL    NULL    NULL    3973    Using where
1   SIMPLE  b   ALL dp_id   NULL    NULL    NULL    304345  
1   SIMPLE  c   ALL NULL    NULL    NULL    NULL    105711  

最佳答案

假设 id 字段被索引,这仍然是一个潜在的巨大数据集。然后你在带有通配符的 varchar 上有一个最终的 where 子句......这将导致对整个结果集进行全表扫描并否定 a.comm 字段上的任何索引。

只是好奇,但是您可以通过将 select * 更改为“select count(a.comm)”并删除 where 子句来测试它吗?如果它仍然需要永远,那就是 where 子句,否则就是结果集的构建。

关于MySQL 查询耗时较长。我尝试了多种查询变体,但似乎没有任何影响速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9457273/

相关文章:

MYSQL 优化表 ORDER BY id DESC

php - 查找用户小部件

java - 尝试运行sql语句时当前光标位置的操作无效

sql - Azure SQL DB : create users with PowerShell, 参数化 SQL 脚本和 Azure Key Vault

mysql - SQL 错误说 CO​​UNT 中的列不存在

linux - 使用其他数据中的列值对基于列值的数据进行子集并在Bash中合并

c# - 删除 datagridview 中选定的行并删除数据库中的行

mysql - Windows 中的 Ubuntu Linux 18.04 WSL : MariaDB service start fails

join - 使用计算列作为 Spotfire 中的键从另一个表插入列

r - 在 data.table 中使用 by 连接继承范围