为什么两个几乎相同的 MySQL 视图之一这么慢?

问题描述 投票:0回答:1

我一直在调查我们的一个应用程序查询运行非常缓慢的问题,它似乎与我们正在使用的特定视图有关。

我有两个 MySQL 5.7 视图“product_families_view”和“product_media_types_view”,它们的结构几乎相同。然而,根据 EXPLAIN 声明,“product_media_types_view”似乎占用了更多的资源。我不明白为什么。

-- pricetooldb.product_families_view source

CREATE OR REPLACE
ALGORITHM = UNDEFINED VIEW `pricetooldb`.`product_families_view` AS
select
    `pfp`.`product_id` AS `product_id`,
    `pfp`.`part_number` AS `part_number`,
    group_concat(`pf`.`family` order by `pf`.`family` ASC separator ', ') AS `families`
from
    (`pricetooldb`.`product_families` `pf`
join `pricetooldb`.`product_families_products` `pfp` on
    ((`pfp`.`family_id` = `pf`.`id`)))
group by
    `pfp`.`product_id`;

-- pricetooldb.product_media_types_view source

CREATE OR REPLACE
ALGORITHM = UNDEFINED VIEW `pricetooldb`.`product_media_types_view` AS
select
    `pmt`.`product_id` AS `product_id`,
    group_concat(`mt`.`name` order by `mt`.`name` ASC separator ' ') AS `media_types`
from
    (`pricetooldb`.`media_types` `mt`
join `pricetooldb`.`product_media_types` `pmt` on
    ((`pmt`.`media_type_id` = `mt`.`id`)))
group by
    `pmt`.`product_id`;

我还将为下面的问题查询提供 EXPLAIN 输出。

|id |select_type|table           |partitions|type  |possible_keys                                                                                |key                                        |key_len|ref                     |rows  |filtered|Extra                                       |
|---|-----------|----------------|----------|------|---------------------------------------------------------------------------------------------|-------------------------------------------|-------|------------------------|------|--------|--------------------------------------------|
|1  |PRIMARY    |skus            |          |ALL   |PRIMARY                                                                                      |                                           |       |                        |46,860|100     |Using filesort                              |
|1  |PRIMARY    |product         |          |eq_ref|PRIMARY                                                                                      |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |10      |Using where                                 |
|1  |PRIMARY    |product_listings|          |ref   |product_listings_asin_index                                                                  |product_listings_asin_index                |22     |pricetooldb.skus.asin   |1     |100     |Using where                                 |
|1  |PRIMARY    |analyst         |          |eq_ref|PRIMARY                                                                                      |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |collection      |          |eq_ref|PRIMARY                                                                                      |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |supplier_pricing|          |eq_ref|PRIMARY                                                                                      |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |amazon_order    |          |eq_ref|PRIMARY,yom_sku                                                                              |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |amazon_pricing  |          |eq_ref|PRIMARY                                                                                      |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |<derived2>      |          |ref   |<auto_key0>                                                                                  |<auto_key0>                                |4      |pricetooldb.skus.yom_sku|10    |100     |                                            |
|1  |PRIMARY    |p               |          |eq_ref|PRIMARY                                                                                      |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |s               |          |eq_ref|PRIMARY,asin                                                                                 |PRIMARY                                    |4      |pricetooldb.skus.yom_sku|1     |100     |                                            |
|1  |PRIMARY    |product_listings|          |ref   |product_listings_asin_index                                                                  |product_listings_asin_index                |22     |pricetooldb.s.asin      |1     |100     |Using where                                 |
|1  |PRIMARY    |<derived5>      |          |ref   |<auto_key0>                                                                                  |<auto_key0>                                |5      |pricetooldb.skus.yom_sku|10    |100     |                                            |
|5  |DERIVED    |mt              |          |index |PRIMARY                                                                                      |media_types_name_unique                    |12     |                        |6     |100     |Using index; Using temporary; Using filesort|
|5  |DERIVED    |pmt             |          |ref   |product_media_types_product_id_media_type_id_unique,product_media_types_media_type_id_foreign|product_media_types_media_type_id_foreign  |5      |pricetooldb.mt.id       |3,759 |100     |                                            |
|2  |DERIVED    |pf              |          |index |PRIMARY                                                                                      |product_families_family_unique             |257    |                        |2,569 |100     |Using index; Using temporary; Using filesort|
|2  |DERIVED    |pfp             |          |ref   |product_entry_unique,product_families_products_family_id_foreign                             |product_families_products_family_id_foreign|4      |pricetooldb.pf.id       |8     |100     |                                            |

使用 SELECT COUNT(*) 的视图之间的行数差异仅为 6k。这是怎么回事?

sql mysql performance query-optimization
1个回答
0
投票

检查索引:导致两个视图之间性能差异的主要因素之一可能是相关表上的索引。检查用于product_media_types_view 和product_media_types 表的media_types 表上的索引。

检查数据分布:两个视图之间的数据分布差异可能很大。使用 SELECT COUNT(*) 不仅可以查看行数,还可以检查数据的分布方式。这可以提供更多见解。

查询和视图优化:检查查询和视图的结构和使用情况以寻找优化机会。例如,如果特定查询导致product_media_types_view 负载过重,则重新排列视图或查询可能会有所帮助。

查看 EXPLAIN 输出:在提供的 EXPLAIN 输出中需要考虑一些关键点。例如,诸如“使用文件排序”或“使用临时”之类的短语可能表明性能问题。

检查 MySQL 版本:请记住,MySQL 5.7 在某些情况下可能会导致性能问题。更新或尝试不同的 MySQL 版本可能有助于解决问题。

通过执行以下步骤,您可以更好地了解问题的根源并采取措施解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.