Mysql查询增强功能

时间:2016-03-21 07:25:36

标签: mysql performance select

我有两个观点。我从中发现了一个视图,因为它们依赖于其他表。然后我创建了一个连接它们的查询。两个查询分别拥有超过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,这就是结果:

enter image description here

谢谢。

2 个答案:

答案 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%')