使用唯一的多列索引表的最佳方法?

时间:2015-09-30 11:18:11

标签: mysql database indexing innodb

我正在创建一个表,它将使用InnoDB存储引擎在MySQL 5.6中存储大约1亿行。该表将有一个外键,它将链接到另一个包含大约500万行的表。

当前表格结构:

`pid`: [Foreign key from another table]

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

`date`: [date field]

并且每个pid应该只有date

的一条记录

在此表上创建索引的最佳方法是什么?

选项#1:在两个字段piddate上创建主索引

选项#2:使用AUTO_INCREMENT和id添加另一列primary index,并在列piddate上创建唯一索引

还是其他任何选择?

我将在此表上使用的选择查询是:

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

3 个答案:

答案 0 :(得分:1)

两种方法都没问题。我更喜欢具有合成主键(即具有附加唯一索引的自动递增版本)。我发现这有几个原因:

  • 您可以与表格建立外键关系。
  • 您有插入顺序的指示。
  • 您可以更改要求,因此如果某些pid每天允许两个值或每周只允许一个值,那么该表可以支持它们。

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

答案 1 :(得分:1)

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

{-# LANGUAGE Arrows #-}

module Main where

import FRP.Timeless
import Debug.Trace

sc = mkKleisli_ $ \_ -> do
  putStrLn "SC"
  return "A"
sp = mkKleisli_ putStrLn

box :: Signal s IO () ()
box = proc _ -> do
  file <- snapOnce <<< sc <<< inhibitsAfter 1 -< ()
  sp -< file
  returnA -< ()

box2 = proc _ -> do
  box -< ()

main = do
  runBox clockSession_ box2

并没有其他索引

一些注意事项:

  • 由于它是InnoDB,所有其他字段都是&#34; clustered&#34;使用PK,因此pid查找就好像PRIMARY KEY(pid, date); 是PK的一部分。 price也非常有效。
  • 无需INDEX(pid,日期,价格)
  • 添加WHERE pid=123 ORDER BY date没有任何收获(除了一些订购提示)。如果需要订购,那么使用AUTO_INCREMENT开始的索引可能是最好的。
  • 额外索引会降低插入速度。特别是date个。

答案 2 :(得分: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输出)