使用MySQL分区加速并发删除和选择?

使用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

我有一个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,
  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语句失败,因为找不到要插入的分区