mysql 分区不工作
好的,我有 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你的分区没问题。您的查询的
WHERE
子句是问题所在。当我在 MySQL 5.5 上运行 EXPLAIN PARTITIONS 语句时,出现两个警告:如果您将查询更改为使用像这样的真实日期,它将使用分区(我没有将索引包含在我的
CREATE TABLE
语句,这就是它们没有被使用的原因):我猜它使用分区
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 theEXPLAIN PARTITIONS
statement on MySQL 5.5, there were two warnings: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):I'm guessing it uses partition
p2
because MySQL supports partial dates (2010-00-00
is less than2010-01-01
): How to deal with "partial" dates (2010-00-00) from MySQL in Django?