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