mysql 分区不工作

发布于 2024-11-26 18:45:18 字数 1450 浏览 7 评论 0原文

好的,我有 200 万行。每个都有一个计费日期。我正在尝试在该日期之前将其划分出来。我已经做了分区。我检查了 /var/lib/mysql ,文件都在那里,所有文件大小都合适,所以我可以看到某些东西正在工作。但是,当我执行 explian paritions select 时,它仍然告诉我它正在使用所有分区。我构建表格的方式是否有问题?查询表?索引?

CREATE TABLE `billing_bil` (
`id_bil` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
`bill_date_bil` date NOT NULL
PRIMARY KEY (`id`,`bill_date_bil`),
KEY `bill_date_bil` (`bill_date_bil`),
KEY `type_bill_date_bil` (`type_bil`,`bill_date_bil`)
) ENGINE=MyISAM AUTO_INCREMENT=2310168 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE ( YEAR(bill_date_bil))
(PARTITION p0 VALUES LESS THAN (2008) ENGINE = MyISAM,
PARTITION p1 VALUES LESS THAN (2009) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (2010) ENGINE = MyISAM,
PARTITION p3 VALUES LESS THAN (2011) ENGINE = MyISAM,
PARTITION p4 VALUES LESS THAN (2012) ENGINE = MyISAM,
PARTITION p5 VALUES LESS THAN (2013) ENGINE = MyISAM,
PARTITION p6 VALUES LESS THAN (2014) ENGINE = MyISAM,
PARTITION p7 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */

EXPLAIN PARTITIONS SELECT SQL_NO_CACHE  id_bil FROM billing_bil WHERE bill_date_bil < '2010'
    id  select_type  table        partitions               type    possible_keys  key      key_len  ref        rows  Extra                   

 1  SIMPLE       billing_bil  p0,p1,p2,p3,p4,p5,p6,p7  index   bill_date_bil  PRIMARY  6        (NULL)  2310167  Using where; Using index

我期望该查询仅使用 p0 和 p1,但它使用了所有这些。

Ok, I have 2 million rows. Each has a billing date. i'm trying to partition this out by that date. I've made partitions. I've checked /var/lib/mysql and the files are there, all of an appropriate file size so I can see something's working. However when I do explian paritions select, its still telling me it's using all the partitions. Am I doing someething wrong with how I built the table? Query the table? Indexes?

CREATE TABLE `billing_bil` (
`id_bil` mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
`bill_date_bil` date NOT NULL
PRIMARY KEY (`id`,`bill_date_bil`),
KEY `bill_date_bil` (`bill_date_bil`),
KEY `type_bill_date_bil` (`type_bil`,`bill_date_bil`)
) ENGINE=MyISAM AUTO_INCREMENT=2310168 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE ( YEAR(bill_date_bil))
(PARTITION p0 VALUES LESS THAN (2008) ENGINE = MyISAM,
PARTITION p1 VALUES LESS THAN (2009) ENGINE = MyISAM,
PARTITION p2 VALUES LESS THAN (2010) ENGINE = MyISAM,
PARTITION p3 VALUES LESS THAN (2011) ENGINE = MyISAM,
PARTITION p4 VALUES LESS THAN (2012) ENGINE = MyISAM,
PARTITION p5 VALUES LESS THAN (2013) ENGINE = MyISAM,
PARTITION p6 VALUES LESS THAN (2014) ENGINE = MyISAM,
PARTITION p7 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */

EXPLAIN PARTITIONS SELECT SQL_NO_CACHE  id_bil FROM billing_bil WHERE bill_date_bil < '2010'
    id  select_type  table        partitions               type    possible_keys  key      key_len  ref        rows  Extra                   

 1  SIMPLE       billing_bil  p0,p1,p2,p3,p4,p5,p6,p7  index   bill_date_bil  PRIMARY  6        (NULL)  2310167  Using where; Using index

I was expecting that query to use p0 and p1 only, but it uses all of them.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

踏雪无痕 2024-12-03 18:45:18

你的分区没问题。您的查询的 WHERE 子句是问题所在。当我在 MySQL 5.5 上运行 EXPLAIN PARTITIONS 语句时,出现两个警告:

+---------+------+------------------------------------------------------------------+
| Level   | Code | Message                                                          |
+---------+------+------------------------------------------------------------------+
| Warning | 1292 | Incorrect date value: '2010' for column 'bill_date_bil' at row 1 |
| Warning | 1292 | Incorrect date value: '2010' for column 'bill_date_bil' at row 1 |
+---------+------+------------------------------------------------------------------+

如果您将查询更改为使用像这样的真实日期,它将使用分区(我没有将索引包含在我的 CREATE TABLE 语句,这就是它们没有被使用的原因):

mysql> EXPLAIN PARTITIONS SELECT SQL_NO_CACHE  id_bil FROM billing_bil WHERE bill_date_bil < '2010-01-01';
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table       | partitions | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | billing_bil | p0,p1,p2   | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+

我猜它使用分区 p2 因为 MySQL 支持部分日期(2010-00-00 小于 2010-01-01):如何处理“部分”日期(2010-00-00)从 Django 中的 MySQL 开始?

Your partitions are fine. Your query's WHERE clause is where the problem lies. When I ran the EXPLAIN PARTITIONS statement on MySQL 5.5, there were two warnings:

+---------+------+------------------------------------------------------------------+
| Level   | Code | Message                                                          |
+---------+------+------------------------------------------------------------------+
| Warning | 1292 | Incorrect date value: '2010' for column 'bill_date_bil' at row 1 |
| Warning | 1292 | Incorrect date value: '2010' for column 'bill_date_bil' at row 1 |
+---------+------+------------------------------------------------------------------+

If you change your query to use a real date like so, it will use the partitions (I didn't include your indexes in my CREATE TABLE statement, which is why they aren't being used):

mysql> EXPLAIN PARTITIONS SELECT SQL_NO_CACHE  id_bil FROM billing_bil WHERE bill_date_bil < '2010-01-01';
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table       | partitions | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | billing_bil | p0,p1,p2   | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------------+------------+--------+---------------+------+---------+------+------+-------+

I'm guessing it uses partition p2 because MySQL supports partial dates (2010-00-00 is less than 2010-01-01): How to deal with "partial" dates (2010-00-00) from MySQL in Django?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文