gpt4 book ai didi

mysql - 如何优化 MySQL View

转载 作者:行者123 更新时间:2023-11-29 01:48:11 26 4
gpt4 key购买 nike

我有一些使用 View 的查询,这些查询的运行速度比我预期的慢很多,因为所有相关表都已编入索引(而且不是那么大)。

我希望我能解释一下:

我的主要查询看起来像这样(大大简化)

select [stuff] from orders as ord 
left join calc_order_status as ors on (ors.order_id = ord.id)

calc_order_status 是一个 View ,定义如下:

create view calc_order_status as
select ord.id AS order_id,
(sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
from orders ord
left join order_items itm on itm.order_id = ord.id
group by ord.id

订单 (ord) 包含订单,order_items 包含与每个订单相关联的单个项目及其价格。

所有表都已正确索引,但运行缓慢,当我执行 EXPLAIN 时,我得到了

  # id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 1 PRIMARY ord ALL customer_id NULL NULL NULL 1002 Using temporary; Using filesort
2 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1002
3 1 PRIMARY cus eq_ref PRIMARY PRIMARY 4 db135147_2.ord.customer_id 1 Using where
4 2 DERIVED ord ALL NULL NULL NULL NULL 1002 Using temporary; Using filesort
5 2 DERIVED itm ref order_id order_id 4 db135147_2.ord.id 2

我的猜测是,“derived2”指的是 View 。个别项目 (itm) 似乎工作正常,按订单 _ id 索引。问题似乎出在第 4 行,这表明系统没有使用订单表 (ord) 的键。但是在 MAIN 查询中,订单 ID 已经定义: left join calc_order_status as ors on (ors.order _ id = ord.id)和 ord.id(在主查询和 View 中)指的是主键。

我在某处读到 MySQL 并没有很好地优化 View ,并且在某些情况下即使可用也可能不会使用键。这似乎是其中一个案例。

如果有任何建议,我将不胜感激。有没有办法强制MySQL实现“这一切比你想象的要简单,只要使用主键就可以了”?还是 View 是解决此问题的错误方法?

最佳答案

如果完全有可能删除这些连接,请删除它们。用子查询代替它们会大大加快速度。

您也可以尝试运行类似这样的程序,看看它是否有任何速度差异。

select [stuff] from orders as ord 
left join (
create view calc_order_status as
select ord.id AS order_id,
(sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
from orders ord
left join order_items itm on itm.order_id = ord.id
group by ord.id
) as ors on (ors.order_id = ord.id)

关于mysql - 如何优化 MySQL View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021319/

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