小编use*_*658的帖子

Mysql分区对索引的影响

我有多个用于业务数据的大表,最小的一个有 3800 万行(24G 数据,26G 索引大小)。我设置了索引来加快查找速度,并将缓冲池设置为总 RAM(116G) 的 80%。即使在这些设置之后,随着时间的推移,我们也开始观察到性能问题。我对磁盘大小(1T)有限制,并且目前无法选择分片。数据增长已增至每天 50 万行。这导致频繁的优化和主开关练习。表模式和索引已经被优化。因此,我开始考虑对表进行分区以提高性能。我的主要分区用例是通过删除分区每月删除数据,这样就不需要优化并改善读/写延迟。以下是其中一个大表的结构(由于法律原因列名已更改 - 假设定义索引的列具有查找用例):

   CREATE TABLE `table_name` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `data_1` int(11) NOT NULL,
     `data_2` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
     `data_3` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
     `data_4` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
     `created_at` datetime DEFAULT NULL,
     `updated_at` datetime DEFAULT NULL,
     PRIMARY KEY (`id`),
     KEY `index_data1` (`data_1`),
     KEY `index_data2` (`data_2`)
   ) ENGINE=InnoDB AUTO_INCREMENT=100572 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

我计划在created_at列上进行分区。然而,问题是分区列必须是所有唯一键的一部分。我可以将created_at列添加到主键,但这会导致索引大小增加,这反过来又会产生副作用。有没有一些解决方法或更好的解决方案?

除了解决这个问题之外,还有一些问题在现有的任何文档或文章中都找不到答案。1.为什么mysql保证分区列是唯一键的一部分?2. 来自 ORM 的查询不存在 create_at 子句,这意味着我们无法对读取进行修剪,但只要插入始终被修剪,我们就可以接受。然而,看起来情况并非如此。为什么mysql要打开所有分区进行插入?

Mysql 版本 - 5.6.33-79.0-log Percona Server (GPL),版本 …

mysql database partitioning database-performance

2
推荐指数
1
解决办法
2042
查看次数