我正在创建一个表,它将使用InnoDB存储引擎在MySQL 5.6中存储大约1亿行。该表将有一个外键,它将链接到另一个包含大约500万行的表。
当前表格结构:
`pid`: [Foreign key from another table]
`price`: [decimal(9,2)]
`date`: [date field]
并且每个pid
应该只有date
在此表上创建索引的最佳方法是什么?
选项#1:在两个字段pid
和date
上创建主索引
选项#2:使用AUTO_INCREMENT和id
添加另一列primary index
,并在列pid
和date
上创建唯一索引
还是其他任何选择?
我将在此表上使用的选择查询是:
SELECT pid,price,date FROM table WHERE pid = 123
答案 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
并没有其他索引
一些注意事项:
PRIMARY KEY(pid, date);
是PK的一部分。 price
也非常有效。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输出)