是一种优化大型mysql查询的方法吗?

n1bvdmb6  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(406)

这是我的问题,它是慢。。。我在寻找优化的方法。

  1. SELECT p.id,
  2. Group_concat(pc.cat_id) AS groups,
  3. p.code,
  4. p.NAME,
  5. p.price,
  6. p.thumbnail,
  7. p.image,
  8. mc.queries AS merch_queries,
  9. mc.position AS merch_position,
  10. Group_concat(op.image) AS option_images,
  11. cf_RETAIL.value AS custom_RETAIL,
  12. cf_rating.value AS custom_rating,
  13. cf_reviews.value AS custom_reviews,
  14. cf_sku.value AS custom_sku,
  15. cf_brand.value AS custom_brand,
  16. cf_custom_thumbnail.value AS custom_custom_thumbnail
  17. FROM s01_products AS p
  18. LEFT JOIN s01_categoryxproduct AS pc
  19. ON p.id = pc.product_id
  20. LEFT JOIN (SELECT pv.product_id,
  21. pv.value
  22. FROM s01_cfm_prodfields AS pf
  23. INNER JOIN s01_cfm_prodvalues AS pv
  24. ON pf.id = pv.field_id
  25. WHERE pf.code = 'RETAIL') AS cf_RETAIL
  26. ON p.id = cf_RETAIL.product_id
  27. LEFT JOIN (SELECT pv.product_id,
  28. pv.value
  29. FROM s01_cfm_prodfields AS pf
  30. INNER JOIN s01_cfm_prodvalues AS pv
  31. ON pf.id = pv.field_id
  32. WHERE pf.code = 'rating') AS cf_rating
  33. ON p.id = cf_rating.product_id
  34. LEFT JOIN (SELECT pv.product_id,
  35. pv.value
  36. FROM s01_cfm_prodfields AS pf
  37. INNER JOIN s01_cfm_prodvalues AS pv
  38. ON pf.id = pv.field_id
  39. WHERE pf.code = 'reviews') AS cf_reviews
  40. ON p.id = cf_reviews.product_id
  41. LEFT JOIN (SELECT pv.product_id,
  42. pv.value
  43. FROM s01_cfm_prodfields AS pf
  44. INNER JOIN s01_cfm_prodvalues AS pv
  45. ON pf.id = pv.field_id
  46. WHERE pf.code = 'sku') AS cf_sku
  47. ON p.id = cf_sku.product_id
  48. LEFT JOIN (SELECT pv.product_id,
  49. pv.value
  50. FROM s01_cfm_prodfields AS pf
  51. INNER JOIN s01_cfm_prodvalues AS pv
  52. ON pf.id = pv.field_id
  53. WHERE pf.code = 'brand') AS cf_brand
  54. ON p.id = cf_brand.product_id
  55. LEFT JOIN (SELECT pv.product_id,
  56. pv.value
  57. FROM s01_cfm_prodfields AS pf
  58. INNER JOIN s01_cfm_prodvalues AS pv
  59. ON pf.id = pv.field_id
  60. WHERE pf.code = 'custom_thumbnail') AS cf_custom_thumbnail
  61. ON p.id = cf_custom_thumbnail.product_id
  62. LEFT JOIN (SELECT p.product_id AS product_id,
  63. Group_concat(q.query) AS queries,
  64. Min(p.position) AS position
  65. FROM s01_srch_merchandisingproduct AS p
  66. LEFT JOIN s01_srch_merchandisingquery AS q
  67. ON q.id = p.query_id
  68. GROUP BY p.product_id) AS mc
  69. ON p.id = mc.product_id
  70. LEFT JOIN s01_options AS op
  71. ON p.id = op.product_id
  72. AND op.image <> ''
  73. WHERE p.active = 1
  74. GROUP BY p.id

谢谢你的帮助!
更新的表架构:

  1. **s01_categoryxproduct**
  2. cat_id,
  3. product_id,
  4. disp_order
  5. **s01_products**
  6. id
  7. catcount
  8. agrpcount
  9. pgrpcount
  10. disp_order
  11. code
  12. name
  13. thumbnail
  14. image
  15. price
  16. cost
  17. descrip
  18. weight
  19. taxable
  20. active
  21. sku
  22. cancat_id
  23. page_id
  24. page_title
  25. dt_created
  26. dt_updated
  27. **s01_CFM_ProdValues**
  28. field_id,
  29. product_id,
  30. value,
  31. value_long
  32. **s01_CFM_ProdFields**
  33. id,
  34. code,
  35. name,
  36. group_id,
  37. fieldtype,
  38. info,
  39. facet
  40. **s01_Options**
  41. id,
  42. product_id,
  43. attr_id,
  44. disp_order,
  45. code,
  46. prompt,
  47. price,
  48. cost,
  49. weight,
  50. image
  51. **s01_SRCH_MerchandisingProduct**
  52. id,
  53. product_id,
  54. query_id,
  55. position
  56. **s01_SRCH_MerchandisingQuery**
  57. id,
  58. query
vu8f3i0k

vu8f3i0k1#

  1. SELECT p.id,
  2. Group_concat(pc.cat_id) AS groups,
  3. p.code,
  4. p.NAME,
  5. p.price,
  6. p.thumbnail,
  7. p.image,
  8. mc.queries AS merch_queries,
  9. mc.position AS merch_position,
  10. Group_concat(op.image) AS option_images,
  11. IF(pf.code = 'RETAIL',pv.value , NULL) AS custom_RETAIL,
  12. IF(pf.code = 'rating',pv.value , NULL) AS custom_rating,
  13. IF(pf.code = 'reviews',pv.value , NULL) AS custom_reviews,
  14. IF(pf.code = 'brand',pv.value , NULL) AS custom_brand,
  15. IF(pf.code = 'custom_thumbnail',pv.value , NULL) AS custom_custom_thumbnail,
  16. pvr.value AS custom_rating,
  17. FROM s01_products AS p
  18. LEFT JOIN s01_categoryxproduct AS pc ON p.id = pc.product_id
  19. LEFT JOIN s01_cfm_prodfields AS cf_RETAIL ON p.id = cf_RETAIL.product_id
  20. LEFT JOIN s01_cfm_prodvalues AS pv ON cf_RETAIL.id = pv.field_id
  21. LEFT JOIN (SELECT p.product_id AS product_id,
  22. Group_concat(q.query) AS queries,
  23. Min(p.position) AS position
  24. FROM s01_srch_merchandisingproduct AS p
  25. LEFT JOIN s01_srch_merchandisingquery AS q
  26. ON q.id = p.query_id
  27. GROUP BY p.product_id) AS mc
  28. ON p.id = mc.product_id
  29. LEFT JOIN s01_options AS op
  30. ON p.id = op.product_id
  31. AND op.image <> ''
  32. WHERE p.active = 1
  33. GROUP BY p.id`;
展开查看全部
dbf7pr2w

dbf7pr2w2#

“过度规范化”和eav是问题所在。
将prodfields和prodvalues放在同一个表中。将它们分成两个表会导致性能消耗开销。
有关优化eav表的详细信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
更多关于eav为何不好的讨论:http://mysql.rjweb.org/doc.php/eav

相关问题