【问题标题】:Query takes a very long time to execute查询需要很长时间才能执行
【发布时间】:2018-06-19 02:31:00
【问题描述】:

我目前正在尝试执行一个查询,但在让它加载几分钟后,我想我可能做错了什么。

这是我要执行的操作:

SELECT *
FROM open_hours
INNER JOIN open_times
    ON open_hours.id = open_times.open_hour_id
INNER JOIN off_peak_times
    ON open_hours.id = off_peak_times.open_hour_id;

我有三张桌子:

开放时间:

大约 14k 行

id;
owner_type;
owner_id;
seats;
time_interval;
max_at_one_time;
created_at;
updated_at;
minutes_in_advance;

开放时间:

大约 18k 行

id;
open_hour_id;
time_start;
time_end;
weekday;
created_at;
meal_type;

off_peak_times:

大约 10k 行

id;
open_hour_id;
time;
discount;
seats;
created_at;
updated_at;
weekday;

我尝试将 SELECT * 减少为 SELECT open_hours.id, open_times.meal_type,因为实际上这是我现在想要获得的唯一数字。它让我在大约 30 秒内得到结果,这对我来说听起来还是很多。

我在其他更大的表上运行其他查询,但几乎可以立即获得结果,那么我是否缺少或没有考虑某些内容?

【问题讨论】:

  • 您是否查看了执行计划以了解它对查询的说明?它可能会建议可以提高性能的索引,或者暗示可以优化查询的方式。
  • 我认为这是你能得到的最好的。您可以考虑使用交叉应用而不是连接,但我不知道这是否有帮助...您还可以增加数据库本身的 DTU/性能层
  • @KenWhite 我没有,因为我不知道什么是“执行计划”哈哈哈。 MySQL / SQL 初学者在这里。现在去谷歌。
  • @james5 好的,谢谢,现在要查找“交叉申请”,这意味着什么哈哈。谢谢!

标签: mysql sql mysql-workbench


【解决方案1】:

运行这个

Alter table open_times add index(open_hour_id);

Alter table off_peak_times 添加索引(open_hour_id);

然后再次运行您的查询。这些表足够小,我现在不用担心阅读一堆关于您的执行计划的信息。我想你会发现这加快了速度。

【讨论】:

    【解决方案2】:

    在您的情况下,要加快查询速度,您可以做三件事。 不知道对你有没有帮助,但根据SQL优化查询概念,一定有帮助。

    1. 为所有表创建CLUSTERED INDEX。集群索引使SELECT 查询速度更快,比率为 30:70。
    2. 您应该制作列列表而不是 STAR 语句(避免使用SELECT *)。额外的列使 BUFFER-POOL 变得沉重。
    3. 您可以使用 VIEW 代替查询。因为 JOIN 语句中的 VIEW 比普通查询要好。

    从以上三个中,您必须尝试第一个选项(CLUSTER INDEX),这将真正提高性能。 希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      为了进一步分析,了解查询行为和表信息很重要。这可以执行以下语句:

      EXPLAIN EXTENDED SELECT * FROM open_hours INNER JOIN open_times ON open_hours.id = open_times.open_hour_id INNER JOIN off_peak_times ON open_hours.id = off_peak_times.open_hour_id\G
      SHOW WARNINGS \G
      EXPLAIN FORMAT=JSON SELECT * FROM open_hours INNER JOIN open_times ON open_hours.id = open_times.open_hour_id INNER JOIN off_peak_times ON open_hours.id = off_peak_times.open_hour_id\G           -- MYSQL 5.6+ only
      

      此外,对于所涉及的每个唯一表:

      SHOW TABLE STATUS FROM <db> LIKE '<tablename>' \G 
      SHOW INDEXES FROM <db>.<tablename> \G 
      SHOW CREATE TABLE <db>.<tablename> \G
      

      【讨论】:

      • 所以...我正在阅读您建议的查询的结果,但我不确定我在看什么,所以我假设这是我应该开始的地方读这个? dev.mysql.com/doc/refman/5.5/en/using-explain.html
      • 基本上,我们试图了解 MySQL 在幕后执行什么来检索您的数据。例如,我们要检查是否存在必要的索引。
      • 那么你想让我在这里发布这些命令的结果吗?
      • 是的,您可以在此处粘贴结果,然后就可以确定您面临的瓶颈。
      • 我将跳过这个,因为我尝试了其他人给出的解决方案,现在它似乎正在做这个伎俩?。不过谢谢!我会阅读更多关于这些的内容
      猜你喜欢
      • 2018-07-06
      • 2016-04-22
      • 2021-12-25
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2011-01-17
      • 2012-12-03
      相关资源
      最近更新 更多