MySQL对VARCHAR进行分区(60)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL对VARCHAR进行分区(60),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2583字,纯文字阅读大概需要4分钟。
内容图文
![MySQL对VARCHAR进行分区(60)](/upload/InfoBanner/zyjiaocheng/883/498182f02e70424b8719dfb775a60ad6.jpg)
我有一个非常大的5亿行表,其中包含以下列:
> id-Bigint-自动递增主索引.
>日期-日期时间-每个日期大约有150万行,删除1年以内的数据.
> uid-VARCHAR(60)-用户ID
> sessionNumber-INT
>开始-INT-开始时间的纪元.
> end-INT-结束时间的纪元.
>与该查询无关的更多列.
uid和sessionNumber的组合形成一个uinque索引.我也有日期索引.
由于规模庞大,我想对桌子进行分区.
我大部分的访问都是按日期进行的,因此按日期范围进行分区似乎很直观,但是由于日期不是唯一索引的一部分,因此这不是一种选择.
选项1:在日期和插入触发前对日期进行分区
我确实没有遇到违反uid和sessionNumber唯一性的常规问题.源数据是一致的,但是连续两天的会话可能会连续两天插入,其中午夜是第一天的结束时间,第二天的开始时间.
我想了解我是否可以删除唯一键,而使用触发器
>检查前一天是否存在具有相同标识符的会话,如果是,
>更新结束日期.
>取消实际的插入.
但是,我不确定是否可以1)在同一张表上触发更新.或2)防止实际插入.
选项2:UID上的线性哈希分区
我的第二个选择是在UID上使用线性哈希分区.但是,我看不到任何利用VARCHAR并将其转换为用于HASH分区的INTEGER的示例.
但是,我找不到从VARCHAR转换为INTEGER的允许方法.例如
ALTER TABLE mytable
PARTITION BY HASH (CAST(md5(uid) AS UNSIGNED integer))
PARTITIONS 20
返回不允许使用分区功能.
解决方法:
HASH分区必须使用32位整数.但是您不能仅使用CAST()将MD5字符串转换为整数.
代替MD5,CRC32()可以采用任意字符串并将其转换为32位整数.但这也不是有效的分区功能.
mysql> alter table v partition by hash(crc32(uid));
ERROR 1564 (HY000): This partition function is not allowed
您可以使用KEY Partitioning而不是HASH分区按字符串进行分区. KEY分区接受字符串.它通过MySQL的内置PASSWORD()函数传递任何输入字符串,该函数基本上与SHA1有关.
但是,这会导致分区策略出现另一个问题:
mysql> alter table v partition by key(uid);
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
表的主键ID不包含您要作为分区依据的列uid.这是restriction of MySQL’s partitioning:
every unique key on the table must use every column in the table’s partitioning expression.
这是我正在测试的故事(将其包含在您的问题中对您来说是个好主意):
CREATE TABLE `v` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`date` datetime NOT NULL,
`uid` varchar(60) NOT NULL,
`sessionNumber` int(11) NOT NULL,
`start` int(11) NOT NULL,
`end` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uid` (`uid`,`sessionNumber`),
KEY `date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
在继续之前,我想知道为什么仍然要使用分区? “绝对大小”不是分区表的原因.
像任何优化一样,进行分区是为了优化要查询的特定查询.任何优化都会以减少其他查询为代价来改善一个查询.优化与表无关.桌子很高兴坐在那里,坐着50亿行,它不在乎.优化是针对查询的.
因此,您需要知道要优化的查询.然后决定策略.对于您需要优化的查询,分区可能不是最佳策略!
内容总结
以上是互联网集市为您收集整理的MySQL对VARCHAR进行分区(60)全部内容,希望文章能够帮你解决MySQL对VARCHAR进行分区(60)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。