Action Keyname Type Unique Packed Column Cardinality Collation Null Comment
Edit Drop PRIMARY BTREE Yes No TickerID 23200 A
Timestamp 13897209 A
Edit Drop TickerID BTREE No No TickerID 11737 A
Edit Drop Timestamp BTREE No No Timestamp 18 A
~99,424,209 InnoDB utf8_general_ci 5.1 GiB
确定之前我尝试通过删除不需要的索引来“优化”此数据库,我想我会在这里问。这个表受到很多打击,所以我想加快插入性能。我在网上阅读了5篇文章,似乎表明TickerID上的单个索引是多余的,因为如果我只对tickerID运行查询,将使用多个索引(TickerID,Timestamp)。
偶尔,我会做EOD报告,这样我就可以做SELECT * WHERE Timestamp > Today() - 1 day
之类的事情。我还需要时间戳索引吗?
答案 0 :(得分:0)
tickerId, timestamp
上的此索引可供所有可在tickerId
上使用索引的查询使用。
但是,对于这样的查询:
SELECT *
FROM mytable
WHERE Timestamp > Today() - 1
(tickerId, timestamp
上的索引将不会被使用,因为tickerId
上没有相等过滤器。
对于此查询,您应该仅在timestamp
上创建索引或重写查询:
SELECT m.*
FROM (
SELECT DISTINCT tickerId
FROM mytable
) md
JOIN mytable m
ON m.tickerId = md.tickerId
AND m.timestamp > TODAY() - 1
但是,后一种查询的效率较低,特别是如果tickerId
中有许多不同的值。