这样的一个SQL:select *
from base_book_1 a, base_book_2 b
where a.bookid =b.id
and a.channelid = 2
and b.status < 5a.channelid的数据分布:
333524 1
134253 2
176078 3
46537 4
56259 5
64538 6
12197 7
36751 8b.status的数据分布:
181 1
619084 2
2426 3
942 4
378 5
191 6channelid和status都创建索引,但由于数据倾斜度大,有时可能不走索引。关键是b.status取值小于5,该部分一定会走全表。对数据库性能造成
比较大的影响,时常观察到cache buffer chains的出现。目前开发人员也刚接手这个遗留项目,不清楚如何优化,如果从SQL角度该如何处理这样的业务逻辑?或者提出什么建议
from base_book_1 a, base_book_2 b
where a.bookid =b.id
and a.channelid = 2
and b.status < 5a.channelid的数据分布:
333524 1
134253 2
176078 3
46537 4
56259 5
64538 6
12197 7
36751 8b.status的数据分布:
181 1
619084 2
2426 3
942 4
378 5
191 6channelid和status都创建索引,但由于数据倾斜度大,有时可能不走索引。关键是b.status取值小于5,该部分一定会走全表。对数据库性能造成
比较大的影响,时常观察到cache buffer chains的出现。目前开发人员也刚接手这个遗留项目,不清楚如何优化,如果从SQL角度该如何处理这样的业务逻辑?或者提出什么建议
from base_book_1 a, base_book_2 b
where a.bookid =b.id
and b.status <=4
and a.channelid = 2
试一下