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

Woj*_*ski 10 mysql indexing inner-join range

我遇到了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;
Run Code Online (Sandbox Code Playgroud)

MBCategory - 包含216583行

ResourcePermission - 包含3098354行.

在MBCategory中我有多个索引(列在索引中排序):

Primary (categoryId)
A (groupId,parentCategoryId,categoryId)
B (groupId,parentCategoryId)
Run Code Online (Sandbox Code Playgroud)

在ResourcePermission中,我有多个索引(列在索引中排序):

Primary - on some column
A (primKey).
Run Code Online (Sandbox Code Playgroud)

当我查看查询计划时,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;
Run Code Online (Sandbox Code Playgroud)

但是这里的第二个问题是材料:在我看来,mysql应该index A (primKey)在连接操作上使用,而不是为每个记录执行Range检查(索引图:0x400),它又需要多年!强制索引没有帮助,mysql仍在为每条记录执行Range检查.

MBCategory中只有23行符合标准,加入后只有75行.如何让mysql在此操作中选择正确的索引?

Woj*_*ski 31

好的,基本问题.我欠自己一杯啤酒.我最近调试的系统不是我开发的系统 - 我的管理层已经为我提供了改进性能的系统(originall团队对此主题没有了解).

经过几周的改进SQL查询,索引,应用程序执行的sql查询数量,我没有检查这个案例中最重要的事情之一!

栏目类型不同!

编写代码的开发人员应该获得相当大的TALK.

感谢帮助 !

  • 我还欠你一杯啤酒 (2认同)