【问题标题】:How to avoid Using temporary; Using filesort on MySql Query如何避免使用临时的;在 MySql 查询上使用文件排序
【发布时间】:2021-11-11 19:46:45
【问题描述】:

目前,我在网站上面临一个相当慢的查询,这也会在更多流量时减慢服务器的速度。如何重写查询或我可以编写什么索引以避免“使用临时;使用文件排序”?如果没有“order by”,一切都会快速运行,但没有想要的结果/顺序。

SELECT cams.name, models.gender, TIMESTAMPDIFF(YEAR, models.birthdate, CURRENT_DATE) AS age, lcs.viewers
FROM cams
         LEFT JOIN cam_tags ON cams.id = cam_tags.cam_id
         INNER JOIN tags ON cam_tags.tag_id = tags.id
         LEFT JOIN model_cams ON cams.id = model_cams.cam_id
         LEFT JOIN models ON model_cams.model_id = models.id
         LEFT JOIN latest_cam_stats lcs ON cams.id = lcs.cam_id
WHERE tags.name = '?'
ORDER BY lcs.time_stamp_id DESC, lcs.viewers DESC
LIMIT 24 OFFSET 96;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE tags NULL const PRIMARY,tags_name_uindex tags_name_uindex 766 const 1 100 Using temporary; Using filesort
1 SIMPLE cam_tags NULL ref PRIMARY,cam_tags_cams_id_fk,cam_tags_tags_id_fk cam_tags_tags_id_fk 4 const 75565047 100 Using where
1 SIMPLE cams NULL eq_ref PRIMARY PRIMARY 4 cam_tags.cam_id 1 100 NULL
1 SIMPLE model_cams NULL eq_ref model_platforms_platforms_id_fk model_platforms_platforms_id_fk 4 cam_tags.cam_id 1 100 NULL
1 SIMPLE models NULL eq_ref PRIMARY PRIMARY 4 model_cams.model_id 1 100 NULL
1 SIMPLE lcs NULL eq_ref PRIMARY,latest_cam_stats_cam_id_time_stamp_id_viewers_index PRIMARY 4 cam_tags.cam_id 1 100 NULL

【问题讨论】:

    标签: mysql performance indexing mariadb


    【解决方案1】:

    在很多情况下,实际上不可能避免“使用临时文件,使用文件排序”。

    “文件排序”不一定涉及“文件”;它通常在 RAM 中完成。因此,性能可能不会受到明显影响。

    也就是说,我假设您的真正问题是“如何加快查询速度?”。

    大部分表格都可以通过PRIMARY 或“eq_ref”访问——一切都很好。但是第二个表涉及到大约 7500 万行!这通常发生在第一张桌子上,而不是第二张桌子上。嗯。

    听起来cam_tags 是一个多对多映射表?而且它没有任何以name 开头的索引开始?有关此类表的正确索引,请参阅此:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

    由于WHEREORDER BY 引用了多个表,因此基本上不可能避免“使用临时,使用文件排序”。

    更糟糕的是,它需要找到所有“name='?'”的,对列表进行排序,跳过 96 行,最后只传递 24 行。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2013-07-07
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多