Mysql的范围检查,而不是在内部连接索引的使用(Mysql range check instead

2019-08-02 08:50发布

我在与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)的加入操作,而不是它执行范围检查每一条记录(索引图:0x400的),它再次需要年龄! 力指数没有帮助,MySQL的仍然执行范围检查每个记录。

有23只在MBCategory行这符合地方标准,并加入后,只有75行。 我怎样才能让MySQL来选择这一操作正确的索引?

Answer 1:

好了,基本的问题。 我欠自己一个啤酒。 我最近tunning的系统是不是我developted系统 - 我已经被分配给它由我管理,以提高性能(记事的原始球队还没有关于这一主题的知识)。

费周提高SQL查询后,索引,被与否有关应用程序执行的SQL查询我没有检查在这种情况下,最重要的事情之一数!

列类型是不同的!

谁写比样的代码开发人员应该得到相当大的TALK。

感谢帮助 !



文章来源: Mysql range check instead of index usage on inner join