索引如何与MySql分区表一起使用

时间:2017-07-07 06:59:13

标签: mysql indexing partition

我有一张包含时间信息的表格,因此该表格包含年,月,日,小时等栏目。
表有多年的数据,而且相当大,所以我决定在这个表上进行分区,开始学习Mysql分区,但很少有人提出问题。
如果有人能帮助我理解分区和索引如何协同工作,我将非常感激。

  1. 如果我创建了年度分区列,并且在同一列上也有索引,那么分区和索引将如何协同工作?它如何影响性能,如果我只有年份列的索引而且表没有分区?
  2. 实施例。 Sql:Select month, day, hour ... from time_table where year = '2017';

    1. 如果表具有分区年份列,并且查询正在过滤月份列和月份列的索引。多月的指数和一年中的分区将如何影响选择性能。
    2. Ex Sql:Select year, month, day .... from time_table where month = '05';

1 个答案:

答案 0 :(得分:2)

分区将表格拆分为,然后我们说,"子表格"。每个子表本质上都是一个表,包含数据和索引。

当表中的SELECTing时,首先要做的是确定哪些分区可能包含所需的数据。这是"分区修剪"并使用"分区键" (显然是year)。然后使用适当的索引将select应用于相关的子表。在这种情况下,INDEX(year, ...)是一种浪费,因为你已经被修剪到了一年。

由于您未在year子句中指定WHERE,因此您的样本选择无法执行分区修剪。因此,它会查看所有分区,并且比没有对表进行分区时要慢。

  • 除非您预计至少有一百万行,否则不要使用分区。 (那将是很多年。)
  • 除非您有一个可以帮助您的用例,否则不要使用分区。 (显然不是你的情况。)
  • 如果计算部件非常容易,则不要列出日期时间的列:YEAR(date)MONTH(date)等。
  • 不要以低基数索引列;无论如何,优化器最终会扫描整个表格 - 因为它更快。 (例如:month='05'

如果你想支持一个步骤并解释你想要完成的事情,也许我们可以讨论另一种方法。

相关问题