【发布时间】:2017-01-11 10:24:48
【问题描述】:
我有一个有 300k 行的表。该表非常重,因此每次查询都会变慢。在尝试了很多索引和其他优化之后,我决定在表上创建分区。
现在我有 3 个版本的表格
- e_update
- e_update_partition(20 个分区使用 HASH(on event_id))
- e_update_partition_event(12 个分区,每个分区有 25K 个条目(在 event_id 上))
现在我在每个表上一个一个地运行相同的查询并比较时间
SELECT eu.event_id
FROM e_update eu
INNER JOIN event e ON e.id=eu.event_id
WHERE eu.start_date > 2010-10-15
AND e.published=1
AND eu.event_id > 25000
AND eu.event_id < 50000;
耗时 - 189911 行,2 个警告(14.43 秒)
SELECT eu.event_id
FROM e_update_partition eu
INNER JOIN event e ON e.id=eu.event_id
WHERE eu.start_date > 2010-10-15
AND e.published=1
AND eu.event_id > 25000
AND eu.event_id < 50000;
耗时 - 189911 行,2 个警告(15.87 秒)
解释结果-
+----+-------------+--------+---------- -------------------------------------------------+ --------+--------------------------------+--------- --+---------+--------+--------+------ ----------------+ |编号 |选择类型 |表|隔断 |类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+---------- -------------------------------------------------+ --------+--------------------------------+--------- --+---------+--------+--------+------ ----------------+ | 1 |简单 |电子|空 |范围 |初级,出版 |发表 | 6 |空 | 120674 |使用索引条件 | | 1 |简单 |欧盟 | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19 |参考 | event_id,开始日期,event_id_2 | event_id | 4 | biztradeshows.e.id | 1 |使用位置 | +----+-------------+--------+---------- -------------------------------------------------+ --------+--------------------------------+--------- --+---------+--------+--------+------ ----------------+SELECT eu.event_id
FROM e_update_partition_event eu
INNER JOIN event e ON e.id=eu.event_id
WHERE eu.start_date > 2010-10-15
AND e.published=1
AND eu.event_id > 25000
AND eu.event_id < 50000;
耗时 - 189911 行,2 个警告(20.56 秒)
解释结果-
+----+-------------+--------+---------- ------------+--------+---------------- ----+-----------+---------+--------------------+-- ------+------------------------+ |编号 |选择类型 |表|隔断 |类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+---------- ------------+--------+---------------- ----+-----------+---------+--------------------+-- ------+------------------------+ | 1 |简单 |电子|空 |范围 |初级,出版 |发表 | 6 |空 | 120674 |使用索引条件 | | 1 |简单 |欧盟 | p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 | eq_ref | event_id,开始日期,event_id_2 | event_id | 4 | biztradeshows.e.id | 1 |使用位置 | +----+-------------+--------+---------- ------------+--------+---------------- ----+-----------+---------+--------------------+-- ------+------------------------+第三次查询的分区架构
(PARTITION p1 VALUES LESS THAN (25000) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (50000) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (75000) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (100000) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (125000) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (150000) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (175000) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN (200000) ENGINE = InnoDB,
PARTITION p9 VALUES LESS THAN (225000) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (250000) ENGINE = InnoDB,
PARTITION p11 VALUES LESS THAN (275000) ENGINE = InnoDB,
PARTITION p12 VALUES LESS THAN (300000) ENGINE = InnoDB)
为什么我的第三个查询比其他两个查询花费更多的时间并且使用了几乎所有的分区?
【问题讨论】:
标签: mysql database-partitioning