【问题标题】:Mysql Query EnhancementMysql查询增强
【发布时间】:2016-07-07 14:50:50
【问题描述】:

我有这 2 两个视图。我对它们进行了查看,因为它们依赖于其他表。然后我创建了一个将它们连接在一起的查询。两个查询分别有超过 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,结果如下:

谢谢。

【问题讨论】:

  • 你为什么不直接SELECT *
  • 还是和“main.*, detail.*”一样……很慢。
  • 这些列是否已编入索引?
  • show details_data sechema..you can share "show create table details_data" 输出...
  • 是的,它们已编入索引。

标签: mysql performance select


【解决方案1】:

如果您在结果集中包含来自detail 表的字段,则查询变慢的唯一原因是detail.main_id 已编入索引,因此如果没有从detail 中选择字段,则mysql 不必触及@987654324 @table,只使用索引就足够了。如果你确实包含了该表中的一些字段,那么简单的索引查找是不够的,mysql 将不得不打开detail 表并从那里获取相应的记录。

【讨论】:

    【解决方案2】:

    尝试使用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%')
    

    【讨论】:

    • 不能使用左连接.. 必须使用内连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多