我在与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来选择这一操作正确的索引?