Mysql 执行查询需要很长时间

Mysql 执行查询需要很长时间,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我有一个查询,我现在正试图执行,但在让它加载几分钟后,我想可能是我做错了什么 以下是我试图执行的内容: 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; 我有三张桌子: 开放时间: 大约1.4万行 id;

我有一个查询,我现在正试图执行,但在让它加载几分钟后,我想可能是我做错了什么

以下是我试图执行的内容:

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;
我有三张桌子:

开放时间:

大约1.4万行

id;
owner_type;
owner_id;
seats;
time_interval;
max_at_one_time;
created_at;
updated_at;
minutes_in_advance;
开放时间:

大约18千行

id;
open_hour_id;
time_start;
time_end;
weekday;
created_at;
meal_type;
非高峰时间:

大约10万行

id;
open_hour_id;
time;
discount;
seats;
created_at;
updated_at;
weekday;
我已经尝试将SELECT*减少为SELECT open_hours.id、open_times.MEINE类型,因为事实上这是我现在唯一想要的数字。它能在大约30秒钟内得到结果,这对我来说仍然很难


我在其他大得多的表上运行其他查询,但几乎可以立即得到结果,因此是否有我遗漏或未考虑的内容?

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

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
显示类似“”的表状态\G
显示来自的索引\G
显示创建表\G

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

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
显示类似“”的表状态\G
显示来自的索引\G
显示创建表\G
运行此

更改表格打开时间添加索引(打开小时id)

更改表关闭高峰时间添加索引(打开小时id)

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

运行此命令

更改表格打开时间添加索引(打开小时id)

更改表关闭高峰时间添加索引(打开小时id)


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

要在您的情况下加快查询速度,您可以做三件事。 不知道它是否会帮助您,但根据SQL优化查询的概念,它必须有所帮助

  • 为所有表创建聚集索引。聚类索引使
    SELECT
    查询以30:70的比率更快
  • 您应该创建列列表而不是星型语句(避免
    SELECT*
    )。额外的列使缓冲池很重
  • 您可以使用视图而不是查询。因为JOIN语句期间的视图比普通查询更好
  • 从以上三个选项中,您必须尝试第一个选项(集群索引),这将真正提高性能。
    希望这会有帮助

    要在您的情况下加快查询速度,您可以做三件事。 不知道它是否会帮助您,但根据SQL优化查询的概念,它必须有所帮助

  • 为所有表创建聚集索引。聚类索引使
    SELECT
    查询以30:70的比率更快
  • 您应该创建列列表而不是星型语句(避免
    SELECT*
    )。额外的列使缓冲池很重
  • 您可以使用视图而不是查询。因为JOIN语句期间的视图比普通查询更好
  • 从以上三个选项中,您必须尝试第一个选项(集群索引),这将真正提高性能。

    希望这会有帮助

    您是否查看了执行计划以了解它对查询的说明?它可能会建议索引来提高性能,或者暗示查询可以优化的方式。我认为这是你能得到的最好的结果。您可以考虑使用交叉应用程序而不是联接,但我不知道这是否有帮助。。。您还可以增加数据库的DTU/性能层itself@KenWhite我没有,因为我不知道什么是“执行计划”哈哈哈。这里是MySQL/SQL初学者。现在就去谷歌看看。@james5好的,谢谢,现在就去查“交叉申请”和它的意思,哈哈。谢谢您是否查看了执行计划以了解它对查询的说明?它可能会建议索引来提高性能,或者暗示查询可以优化的方式。我认为这是你能得到的最好的结果。您可以考虑使用交叉应用程序而不是联接,但我不知道这是否有帮助。。。您还可以增加数据库的DTU/性能层itself@KenWhite我没有,因为我不知道什么是“执行计划”哈哈哈。这里是MySQL/SQL初学者。现在就去谷歌看看。@james5好的,谢谢,现在就去查“交叉申请”和它的意思,哈哈。谢谢所以我正在阅读你建议的查询结果,我不确定我在看什么,所以我假设这就是我应该开始阅读的地方?基本上,我们试图了解MySQL在幕后执行什么来检索您的数据。例如,我们想检查是否存在必要的索引。那么您希望我在这里发布这些命令的结果吗?是的,您可以将结果粘贴到这里,然后就可以确定您所面临的瓶颈。我将跳过这一点,因为我尝试了其他人给出的解决方案,它似乎正在发挥作用现在就这样。。。我正在阅读你建议的查询结果,我不确定我在看什么,所以我假设这就是我应该开始阅读的地方?基本上,我们试图了解MySQL在幕后执行什么来检索您的数据。例如,我们想检查是否存在必要的索引。那么您希望我在这里发布这些命令的结果吗?是的,您可以将结果粘贴到这里,然后就可以确定您所面临的瓶颈。我将跳过这一点,因为我尝试了其他人给出的解决方案,它似乎正在发挥作用现在