我遇到了
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在此操作中选择正确的索引?