我有两个观点。我从中发现了一个视图,因为它们依赖于其他表。然后我创建了一个连接它们的查询。两个查询分别拥有超过30k的数据。
示例查询将如下:
Select main.*, detail.*
FROM main_data as main
INNER JOIN detail_data AS details ON (main.id = detail.main_id)
WHERE main.column_data LIKE '%something%'
这很慢,但是如果我在列部分注释掉“detail。*”并且连接存在,则会非常快速地返回数据。这有什么不对? 预期的数据量仅为20行。执行选择仍然需要很长时间。是什么让它变慢?
我想补充一点,视图上的连接表是正确的。它相应地加入了。就像我说的,如果单独查询,它会在很短的时间内返回大量数据。
有关详细信息,实际上这里有第三个表,其中两个表都是子表。我把它改成了这样的东西。它稍微改善了性能。
Select main.*, detail.*
FROM parent_data AS par
INNER JOIN main_data as main ON (par.id = detail.par_id)
INNER JOIN detail_data AS details ON (par.id = detail.par_id)
WHERE main.column_data LIKE '%something%'
我在确切的表上做了一个EXPLAIN SELECT,这就是结果:
谢谢。
答案 0 :(得分:0)
如果在detail
表的结果集中包含字段,查询速度变慢的唯一原因是detail.main_id
被编入索引,因此如果没有从detail
中选择任何字段,那么mysql会不必触摸detail
表,仅使用索引就足够了。如果你确实包含了该表中的一些字段,那么简单的索引查找就不够了,mysql必须打开detail
表并从那里获取相应的记录。
答案 1 :(得分:0)
尝试使用left join
因为您只需要从右表中连接的记录:
Select main.*, detail.*
FROM main_data as main
LEFT JOIN detail_data AS details
ON (main.id = detail.main_id AND main.column_data LIKE '%something%')