我一直在调查我们的一个应用程序查询运行非常缓慢的问题,它似乎与我们正在使用的特定视图有关。
我有两个 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。这是怎么回事?
检查索引:导致两个视图之间性能差异的主要因素之一可能是相关表上的索引。检查用于product_media_types_view 和product_media_types 表的media_types 表上的索引。
检查数据分布:两个视图之间的数据分布差异可能很大。使用 SELECT COUNT(*) 不仅可以查看行数,还可以检查数据的分布方式。这可以提供更多见解。
查询和视图优化:检查查询和视图的结构和使用情况以寻找优化机会。例如,如果特定查询导致product_media_types_view 负载过重,则重新排列视图或查询可能会有所帮助。
查看 EXPLAIN 输出:在提供的 EXPLAIN 输出中需要考虑一些关键点。例如,诸如“使用文件排序”或“使用临时”之类的短语可能表明性能问题。
检查 MySQL 版本:请记住,MySQL 5.7 在某些情况下可能会导致性能问题。更新或尝试不同的 MySQL 版本可能有助于解决问题。
通过执行以下步骤,您可以更好地了解问题的根源并采取措施解决问题。