使用MySQL分区加速并发删除和选择?
我有一个MySQL Innodb表,它包含大约850万行。表结构基本上如下所示:使用MySQL分区加速并发删除和选择?,mysql,sql,performance,partitioning,Mysql,Sql,Performance,Partitioning,我有一个MySQL Innodb表,它包含大约850万行。表结构基本上如下所示: CREATE TABLE `mydatatable` ( `ext_data_id` int(10) unsigned NOT NULL, `datetime_utc` date NOT NULL DEFAULT '0000-00-00', `type` varchar(8) NOT NULL DEFAULT '', `value` decimal(6,2) DEFAULT NULL, PRIM
CREATE TABLE `mydatatable` (
`ext_data_id` int(10) unsigned NOT NULL,
`datetime_utc` date NOT NULL DEFAULT '0000-00-00',
`type` varchar(8) NOT NULL DEFAULT '',
`value` decimal(6,2) DEFAULT NULL,
PRIMARY KEY (`ext_data_id`,`datetime_utc`,`type`),
KEY `datetime_utc` (`datetime_utc`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
每天晚上,我都会通过以下查询从此表中删除过期值:
delete from mydatatable where datetime_utc < '2013-09-23'
此查询似乎不使用独立项,并且运行它需要相当长的时间。但是,我也会在同一个表上获得并发更新和选择。然后这些被锁定,导致我的网站当时没有响应
我正在寻找各种方法来加快这个设置。我对MySQL分区进行了扫描,我想知道这是否适合。我总是向该表添加和选择较新的数据,并删除旧的数据。我可以基于MODDAYOFYEARdatetime,4之类的东西创建分区。现在,当我删除时,我总是从另一个分区删除值,而不是从我正在读取或写入的分区
使用此设置是否会遇到锁定?在我的例子中,分区会提高查询速度和可用性吗?或者我应该寻找另一个解决方案,如果是,是哪一个 你的思路绝对正确。您应该在这里创建每日分区并在其中存储数据,您的查询将得到革命性的改变,并将像法拉利一样运行。还要看一下本地索引。
同样对于分区,如果您以前的数据不会干扰,那么您可以保留或删除它也不会有太大区别。事实上,您可以简单地删除分区,而不是删除分区。这也很快。你的思路绝对正确。您应该在这里创建每日分区并在其中存储数据,您的查询将得到革命性的改变,并将像法拉利一样运行。还要看一下本地索引。
同样对于分区,如果您以前的数据不会干扰,那么您可以保留或删除它也不会有太大区别。事实上,您可以简单地删除分区,而不是删除分区。这也非常快。因为MySQL 5.5可以使用函数,这简化了对非整数列(如datetime\u utc)的分区 至于表现: 对于列表分区和范围分区,删除分区是一个固定时间操作。速度相当于截断表或rm文件,因此实际上与分区大小无关。 在分区表上执行SELECT的好处在于,这样您就可以只从与搜索条件匹配的分区中进行读取。这也可以加速范围扫描。 提示: 不要忘记添加默认分区,例如
PARTITION the_last_one VALUES LESS THAN(MAXVALUE)
为了避免INSERT/UPDATE语句失败,因为找不到要插入的分区 由于MySQL 5.5可以使用函数,这简化了对非整数列(如datetime_utc)的分区 至于表现: 对于列表分区和范围分区,删除分区是一个固定时间操作。速度相当于截断表或rm文件,因此实际上与分区大小无关。 在分区表上执行SELECT的好处在于,这样您就可以只从与搜索条件匹配的分区中进行读取。这也可以加速范围扫描。 提示: 不要忘记添加默认分区,例如
PARTITION the_last_one VALUES LESS THAN(MAXVALUE)
为了避免INSERT/UPDATE语句失败,因为找不到要插入的分区