这是我的查询和结构数据:
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/