2015-09-30 115 views
1

我正在创建一个表,它将使用InnoDB存储引擎在MySQL 5.6中存储大约1亿行。该表将有一个外键,将链接到约500万行的另一个表。用独特的多列索引表格的最佳方法是什么?

当前表结构:

`pid`: [Foreign key from another table] 

`price`: [decimal(9,2)] 

`date`: [date field] 

pid应该有一个date

什么是创建这个表索引的最佳途径只有一条记录?

选项#1:添加另一列id与AUTO_INCREMENT和primary indexpid列创建唯一索引和date

:两个字段 piddate

选项#2创建主索引

还是其他选项?

只有我将使用此表上选择查询是:

SELECT pid,price,date FROM table WHERE pid = 123 

回答

1

根据你所说的(100M;唯一的查询是...; InnoDB的;等):

PRIMARY KEY(pid, date); 

,并没有其他的指标

一些注意事项:

  • 既然是InnoDB中,字段的所有其余的“聚集”与PK,所以查找通过pid就好像price是PK的一部分。 WHERE pid=123 ORDER BY date也会非常有效。
  • 不需要INDEX(pid,date,price)
  • 添加一个AUTO_INCREMENT没有任何效果(除了一点排序)。如果你需要需要排序,那么开始date可能是最好的。
  • 额外的索引减慢插入。特别是UNIQUE个。
1

两种方法是罚款。我更喜欢有合成主键(即带有附加唯一索引的自动递增版本)。我发现这是有用的几个原因:

  • 您可以有一个外键关系的表。
  • 您有一个插入顺序的指示符。
  • 您可以更改要求,所以如果某些pid s每天允许两个值或每周只允许一个值,则该表可以支持它们。

也就是说,这样的列还有额外的开销。当您访问数据时,此开销会增加空间和少量时间。你有一个非常大的桌子,所以你可能想要避免这个额外的努力。

+0

好的,谢谢我会选择#1 – Badal

+0

如果你打算在索引中包含'date',你可以包括'price'。无论是“pid”,还是全部三列。 –

+0

不,如果我创建一个三列唯一索引,我可能会得到同一日期的重复条目(因为在同一天可能有两个不同的价格)。 – Badal

0

我会尝试用试图覆盖查询的索引,希望MySQL只能访问索引才能获得结果集。

ALTER TABLE `table` ADD INDEX `pid_date_price` (`pid` , `date`, `price`); 

ALTER TABLE `table` ADD INDEX `pid_price_date` (`pid` , `price`, `date`); 

选择第一个,如果你认为你可能需要选择在PID和日期在未来,或者第二个使用条件,如果你认为的条件将是最有可能的超过pid和价格。

这样一来,该指数的所有数据的查询需求(PID,价格和日期)及其在右列(PID)

顺便说索引,请务必使用EXPLAIN来看看查询规划将真正使用整个索引(看看key和keylen输出)

+0

如果我创建一个三列索引,你不觉得它会减慢插入? – Badal

+0

当然,每个添加的索引都会减慢插入。这是一个瓶颈所在。 – mamuso

相关问题