gpt4 book ai didi

MySQL View 花费太多时间来选择数据

转载 作者:行者123 更新时间:2023-11-29 06:52:51 25 4
gpt4 key购买 nike

在我正在处理的网页中,我需要根据三个表中的不同用户详细信息显示一些统计信息。所以我有以下查询,我加入了更多不同的表:

SELECT *
FROM `user` `u`
LEFT JOIN `subscriptions` `s` ON `u`.`user_id` = `s`.`user_id`
LEFT JOIN `devices` `ud` ON `u`.`user_id` = `ud`.`user_id`
GROUP BY `u`.`user_id`

当我使用 LIMIT 1000 执行查询时,大约需要 0.05 秒,因为我在很多查询中使用了所有三个表中的数据,所以我我们决定将它放在 VIEW 中:

CREATE VIEW `user_details` AS ( the same query from above )

现在当我运行时:

SELECT * FROM user_details LIMIT 1000

大约需要 7-10 秒。

所以我的问题是我是否可以做一些事情来优化 View ,因为查询似乎非常快,或者我应该整个查询而不是 View ?

编辑:这是 EXPLAIN SELECT * FROM user_details 返回的内容

+----+-------------+------------+--------+----------------+----------------+---------+------------------------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+----------------+----------------+---------+------------------------+--------+-------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 322666 | |
| 2 | DERIVED | u | index | NULL | PRIMARY | 4 | NULL | 372587 | |
| 2 | DERIVED | s | eq_ref | PRIMARY | PRIMARY | 4 | db_users.u.user_id | 1 | |
| 2 | DERIVED | ud | ref | device_id_name | device_id_name | 4 | db_users.u.user_id | 1 | |
+----+-------------+------------+--------+----------------+----------------+---------+------------------------+--------+-------+

一组 4 行(8.67 秒)

这就是 explain 为查询返回的内容:

+----+-------------+-------+--------+----------------+----------------+---------+------------------------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+----------------+----------------+---------+------------------------+--------+-------+
| 1 | SIMPLE | u | index | NULL | PRIMARY | 4 | NULL | 372587 | |
| 1 | SIMPLE | s | eq_ref | PRIMARY | PRIMARY | 4 | db_users.u.user_id | 1 | |
| 1 | SIMPLE | ud | ref | device_id_name | device_id_name | 4 | db_users.u.user_id | 1 | |
+----+-------------+-------+--------+----------------+----------------+---------+------------------------+--------+-------+

一组 3 行(0.00 秒)

最佳答案

就性能而言, View 和连接非常糟糕。这或多或少适用于所有关系数据库管理系统。听起来很奇怪,因为这就是那些系统的设计目的,但这是事实。

如果这是您页面上频繁使用的查询,请尽量避免连接:而是创建一个由三个表填充的真实表(而不是 View )。您可以使用触发器自动执行该过程。因此,每次将条目插入原始表之一时,触发器都会注意将数据传播到物理 user_details 表。

此策略当然意味着对设置进行一次性投资,但您肯定会获得更好的性能。

关于MySQL View 花费太多时间来选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14436705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com