mysql 分区索引失效_为什么MySQL不使用我的分区作为索引?

探讨了MySQL中使用hash分区的挑战及优化方法,特别是针对distinct查询效率的提升。

我创建了一个以数字ID分区的表:

CREATE TABLE mytable (

...

`id` int(11) DEFAULT NULL

...

) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH (`id`) PARTITIONS 100

我没有主键,但有许多索引.我的表中没有任何数据,其中id小于0或大于30(此时,我希望这会增长).我的大多数查询首先包含减少搜索空间的ID.

我想一个查询从mytable中选择distinct(id)然后只返回其中包含数据的分区数.我很惊讶,对此的解释反而完全扫描了数据:

explain partitions select distinct(id) from mytable;

| 1 | SIMPLE | mytable | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61,p62,p63,p64,p65,p66,p67,p68,p69,p70,p71,p72,p73,p74,p75,p76,p77,p78,p79,p80,p81,p82,p83,p84,p85,p86,p87,p88,p89,p90,p91,p92,p93,p94,p95,p96,p97,p98,p99 | ALL | NULL | NULL | NULL | NULL | 24667132 | Using temporary |

explain select distinct(id) from mytable;

+----+-------------+----------------------+------+---------------+------+---------+------+----------+-----------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+----------------------+------+---------------+------+---------+------+----------+-----------------+

| 1 | SIMPLE | mytable | ALL | NULL | NULL | NULL | NULL | 24667132 | Using temporary |

+----+-------------+----------------------+------+---------------+------+---------+------+----------+-----------------+

然后我阅读了this stackoverflow回答,这启发了MySQL的分区hash()函数的工作原理.

我的问题是,如何让MySQL将表中的每个id映射到自己的分区,以便选择id将搜索范围缩小到单个表(而select distinct()只需要计算分区数而不是扫描他们)?

我正在使用服务器版本:5.5.35-0ubuntu0.12.04.2(Ubuntu).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值