gpt4 book ai didi

Mysql 范围检查而不是内部连接上的索引使用情况

转载 作者:IT王子 更新时间:2023-10-28 23:53:34 25 4
gpt4 key购买 nike

我在使用 MySQL (innoDB) 5.0 时遇到了严重问题。

一个非常简单的 SQL 查询被一个非常意外的查询计划执行。

查询:

SELECT 
SQL_NO_CACHE
mbCategory.*

FROM
MBCategory mbCategory

INNER JOIN ResourcePermission as rp
ON rp.primKey = mbCategory.categoryId

where mbCategory.groupId = 12345 AND mbCategory.parentCategoryId = 0
limit 20;

MBCategory - 包含 216583 行

ResourcePermission - 包含 3098354 行。

在 MBCategory 中,我有多个索引(列顺序与索引相同):

Primary (categoryId)
A (groupId,parentCategoryId,categoryId)
B (groupId,parentCategoryId)

在 ResourcePermission 中我有多个索引(列顺序与索引相同):

Primary - on some column
A (primKey).

当我查看查询计划时,Mysql 首先更改表顺序并从 ResourcePermission 中选择行,然后加入 MBCategory 表(疯狂的想法),这需要很长时间。所以我添加了 STRAIGHT_JOIN 来强制 innodb 引擎使用正确的表序列:

SELECT

STRAIGHT_JOIN SQL_NO_CACHE
mbCategory.*

FROM
MBCategory
mbCategory

INNER JOIN ResourcePermission as rp
ON rp.primKey = mbCategory.categoryId

where mbCategory.groupId = 12345 AND mbCategory.parentCategoryId = 0
limit 20;

但是这里的第二个问题materialzie:在我看来,mysql 应该在连接操作中使用 index A (primKey) ,而不是对每条记录执行 Range 检查(索引映射:0x400),这又需要很长时间!强制索引没有帮助,mysql 仍在为每条记录执行 Range 检查。

MBCategory 中只有 23 行满足 where 条件,连接后只有 75 行。我怎样才能让mysql在这个操作中选择正确的索引?

最佳答案

好的,基本问题。我欠自己一杯啤酒。我最近调整的系统不是我开发的系统 - 我的管理层指派我来改进性能(原始团队不了解此主题)。

经过数周的改进 SQL 查询、索引、应用程序正在执行的 SQL 查询数量后,我没有检查在这种情况下最重要的事情之一!!

列类型不同!

编写过多种代码的开发人员应该得到相当大的 TALK。

感谢帮助!

关于Mysql 范围检查而不是内部连接上的索引使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13254023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com