让我们通过哈希分析最简单的MySQL分区示例(稍微修改后的http://dev.mysql.com/doc/refman/5.5/en/alter-table-partition-operations.html版本):
CREATE TABLE t1 (
id INT,
year_col INT
);
ALTER TABLE t1
PARTITION BY HASH(year_col)
PARTITIONS 8;
我们说我们有数百万条记录。问题是 - 如果有特定查询(例如SELECT * FROM t1 WHERE year_col = 5
),那么MySQL如何知道要查找哪个分区?有8个分区。我想哈希函数是计算好的,并且MySQL认识到它与分区键匹配,然后MySQL知道哪一个是。但问题是SELECT * FROM t1 WHERE year_col IN (5, 45, 5435)
是什么?其他非平凡的查询怎么样?那有什么通用的算法吗?
答案 0 :(得分:1)
只要
WHERE
条件可以减少到以下两种情况之一,优化器就可以执行修剪:
partition_column =常量
partition_column IN( constant1,constant2,...,constantN )
在第一种情况下,优化器只是评估给定值的分区表达式,确定哪个分区包含该值,并仅扫描该分区。 (...)
在第二种情况下,优化器评估列表中每个值的分区表达式,创建匹配分区的列表,然后仅扫描此分区列表中的分区。 (...)
MySQL可以对
SELECT
,DELETE
和UPDATE
语句应用分区修剪。INSERT
语句目前无法修剪。修剪也可以应用于短范围,优化程序可以将其转换为等效的值列表。 (...)