MySQL如何知道要查找哪个分区?

时间:2014-04-15 15:37:51

标签: mysql database-partitioning

让我们通过哈希分析最简单的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)是什么?其他非平凡的查询怎么样?那有什么通用的算法吗?

1 个答案:

答案 0 :(得分:1)

这称为Partition pruning

  

只要WHERE条件可以减少到以下两种情况之一,优化器就可以执行修剪:

     
      
  • partition_column =常量

  •   
  • partition_column IN( constant1,constant2,...,constantN

  •   
     

在第一种情况下,优化器只是评估给定值的分区表达式,确定哪个分区包含该值,并仅扫描该分区。 (...)

     

在第二种情况下,优化器评估列表中每个值的分区表达式,创建匹配分区的列表,然后仅扫描此分区列表中的分区。 (...)

     

MySQL可以对SELECTDELETEUPDATE语句应用分区修剪。 INSERT语句目前无法修剪。

     

修剪也可以应用于短范围,优化程序可以将其转换为等效的值列表。 (...)