【发布时间】:2021-01-07 05:22:15
【问题描述】:
我在 WooCommerce 中有 25000 多种产品。
我正在使用 CUSTOM MYSQL 查询来查询我的产品,因为我希望获取最少的数据,而不是在一个对象中获取整个产品。
查询工作正常,如下所示:
SELECT
p.ID,
m1.meta_value as 'cut',
m2.meta_value as 'polish',
m3.meta_value as 'symmetry',
m4.meta_value as 'fluor_intensity',
m5.meta_value as 'short_name',
m6.meta_value as 'total_sales_price',
m7.meta_value as 'available',
m8.meta_value as 'lab',
m9.meta_value as 'shape',
m10.meta_value as 'size',
m11.meta_value as 'color',
m12.meta_value as 'clarity',
m13.meta_value as 'depth_percent',
m14.meta_value as 'table_percent',
m15.meta_value as 'meas_length',
m16.meta_value as 'meas_width',
m17.meta_value as 'meas_depth',
m18.meta_value as 'price_per_caret',
m19.meta_value as 'fancy_color',
m20.meta_value as 'fancy_intensity',
m21.meta_value as 'image',
m22.meta_value as 'meas_ratio',
m23.meta_value as 'treatment',
m24.meta_value as 'culet_size'
FROM
wp_u8gwgg_posts p
LEFT JOIN wp_u8gwgg_postmeta m1 ON p.id = m1.post_id AND m1.meta_key = '_diamond_cut'
LEFT JOIN wp_u8gwgg_postmeta m2 ON p.id = m2.post_id AND m2.meta_key = '_diamond_polish'
LEFT JOIN wp_u8gwgg_postmeta m3 ON p.id = m3.post_id AND m3.meta_key = '_diamond_symmetry'
LEFT JOIN wp_u8gwgg_postmeta m4 ON p.id = m4.post_id AND m4.meta_key = '_diamond_fluor_intensity'
LEFT JOIN wp_u8gwgg_postmeta m5 ON p.id = m5.post_id AND m5.meta_key = '_diamond_shortname'
LEFT JOIN wp_u8gwgg_postmeta m6 ON p.id = m6.post_id AND m6.meta_key = '_price'
LEFT JOIN wp_u8gwgg_postmeta m7 ON p.id = m7.post_id AND m7.meta_key = '_diamond_available'
LEFT JOIN wp_u8gwgg_postmeta m8 ON p.id = m8.post_id AND m8.meta_key = '_diamond_lab'
LEFT JOIN wp_u8gwgg_postmeta m9 ON p.id = m9.post_id AND m9.meta_key = '_diamond_shape'
LEFT JOIN wp_u8gwgg_postmeta m10 ON p.id = m10.post_id AND m10.meta_key = '_diamond_size'
LEFT JOIN wp_u8gwgg_postmeta m11 ON p.id = m11.post_id AND m11.meta_key = '_diamond_color'
LEFT JOIN wp_u8gwgg_postmeta m12 ON p.id = m12.post_id AND m12.meta_key = '_diamond_clarity'
LEFT JOIN wp_u8gwgg_postmeta m13 ON p.id = m13.post_id AND m13.meta_key = '_diamond_depth_percent'
LEFT JOIN wp_u8gwgg_postmeta m14 ON p.id = m14.post_id AND m14.meta_key = '_diamond_table_percent'
LEFT JOIN wp_u8gwgg_postmeta m15 ON p.id = m15.post_id AND m15.meta_key = '_diamond_meas_length'
LEFT JOIN wp_u8gwgg_postmeta m16 ON p.id = m16.post_id AND m16.meta_key = '_diamond_meas_width'
LEFT JOIN wp_u8gwgg_postmeta m17 ON p.id = m17.post_id AND m17.meta_key = '_diamond_meas_depth'
LEFT JOIN wp_u8gwgg_postmeta m18 ON p.id = m18.post_id AND m18.meta_key = '_diamond_price_per_carat'
LEFT JOIN wp_u8gwgg_postmeta m19 ON p.id = m19.post_id AND m19.meta_key = '_diamond_fancy_color'
LEFT JOIN wp_u8gwgg_postmeta m20 ON p.id = m20.post_id AND m20.meta_key = '_diamond_fancy_intensity'
LEFT JOIN wp_u8gwgg_postmeta m21 ON p.id = m21.post_id AND m21.meta_key = '_knawatfibu_url'
LEFT JOIN wp_u8gwgg_postmeta m22 ON p.id = m22.post_id AND m22.meta_key = '_diamond_meas_ratio'
LEFT JOIN wp_u8gwgg_postmeta m23 ON p.id = m23.post_id AND m23.meta_key = '_diamond_treatment'
LEFT JOIN wp_u8gwgg_postmeta m24 ON p.id = m24.post_id AND m24.meta_key = '_diamond_culet_size'
WHERE p.post_type = "product"
ORDER BY total_sales_price+0 ASC
LIMIT 0, 12
当我在查询中添加ORDER BY total_sales_price+0 ASC 时,真正的难题发生了。
因此,当我不添加 ORDER BY 子句时,查询会在 0.02s 左右为我提供结果
与ORDER BY 相同的查询在 9.4s
问题:
- 如何使用
ORDER BY子句减少获取记录的时间? - 有没有什么方法可以让这个查询对最终用户更好地执行?
提前致谢。
【问题讨论】:
-
显示
explain select rest-of-your-query的输出,有和没有顺序,以及show create table wp_u8gwgg_posts和show create table wp_u8gwgg_postmeta的输出 -
您有没有 _price 元键值的产品吗?
-
这里的问题是,当查询要对 25000 条记录中的数据进行排序(使用 ORDER BY 时)时,与左连接一起花费的时间太长。否则,带有 LEFT JOIN 的查询也给了我完美的时机。
-
所有产品都有 _price 元键。没有元密钥为空的产品
-
那么无论是两个 LEFT JOIN 还是 24 对查询性能没有影响(或只有微不足道的影响)?
标签: php mysql wordpress woocommerce