为什么MySQL不使用我的分区作为索引?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么MySQL不使用我的分区作为索引?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2524字,纯文字阅读大概需要4分钟。
内容图文
![为什么MySQL不使用我的分区作为索引?](/upload/InfoBanner/zyjiaocheng/905/e53e12819b094898aa3c232e8d0bf8ec.jpg)
我创建了一个以数字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).
解决方法:
首先,你将两种不同的东西混为一谈.一个是SELECT WHERE id =?应该只搜索一个分区.你提到但没有指明它当前是否有效的东西(根据你的表定义,我不明白为什么它不应该).
第二件事,SELECT distinct(id)只触及分区信息,与此截然不同.但是,如果我理解正确,你假设一个分区只有一种id.但这并不是HASH分区的工作原理.它的工作方式类似于传统的哈希表,通过将大的密钥空间映射到一个小的密钥空间(在您的情况下为100).因此每个分区都有许多可能的ID.由于mysql不会跟踪哪个可能的ID确实存在于一个分区中,所以它只能扫描每个分区,执行DISTINCT并返回结果.也就是说,它可以在各个分区而不是整个表上执行DISTINCT操作,它可以并行执行此操作,但是,解释似乎暗示它将创建一个大的临时来执行DISTINCT,可能是因为这个优化尚未实施.
内容总结
以上是互联网集市为您收集整理的为什么MySQL不使用我的分区作为索引?全部内容,希望文章能够帮你解决为什么MySQL不使用我的分区作为索引?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。