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.
感谢帮助 !
归档时间: |
|
查看次数: |
7067 次 |
最近记录: |