mysql 不在范围内_Mysql范围检查而不是内连接上的索引用法

我遇到了

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;

但这里的第二个问题是材料:

在我看来,mysql应该在连接操作上使用索引A(primKey),而不是为每条记录执行Range检查(索引映射:0x400),它再次需要很长时间!

强制索引没有帮助,mysql仍然对每条记录执行Range检查.

MBCategory中只有23行符合标准,加入后只有75行.

如何让mysql在此操作中选择正确的索引?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值