升级mysql 8.0.28后索引无法正常工作

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

该问题是在mysql 8.0.28升级后出现的。我有一个名为 user_products 的表。当我对其运行 EXPLAIN SELECT 查询时,识别的可能键是 user_id、productId、status、product_to 和 Product_multicol。密钥为productId,密钥长度为4。 将mysql从5.7升级到8.0.28

查询本身是:

    SELECT user_products.id,user_products.status,user_products.delivery_date,user_products.product_to,user_products.category_id,users.username,user_groups.name FROM user_products 
LEFT JOIN category ON category.id = user_products.category_id
LEFT JOIN users ON user_products.user_id = users.id
LEFT JOIN user_groups ON user_groups.id = users.user_group_id
WHERE user_products.status = 0 AND user_products.product_to = "10" AND user_products.delivery_date <= CURDATE() 
ORDER BY user_products.id DESC

对于 user_products.product_to = "49",查询执行大约需要 5 秒。然而,对于product_to的其他值,只需要0.007秒。 当我尝试使用 FORCE INDEX 时,它花费的时间更少。

mysql database select indexing mysql-8.0
1个回答
0
投票

啊,MySQL 升级后索引使用变化的经典案例。以下是可能发生的情况:

MySQL 8.0 引入了一种新的基于成本的优化器,有时可以做出与 5.7 不同的选择。

对于product_to =“49”,您可能会遇到更多行,导致MySQL选择不同的执行计划。

FORCE INDEX 工作得更好表明优化器正在针对特定情况做出次优选择。

尝试的快速修复:

更新统计数据:

分析表 user_products;

如果仍然存在,请考虑添加复合索引:

在 user_products 上创建索引 idx_product_status_date(product_to,status,delivery_date);

作为最后的手段,对有问题的情况使用索引提示:

请记住,强制索引应该是一个临时解决方案。根本原因可能是统计数据过时或需要调整指数。

在这些更改之后监视查询性能。如果问题仍然存在,您可能需要更深入地研究执行计划或考虑重写查询。

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