冗余的MySQL索引?

时间:2011-07-14 14:23:04

标签: mysql indexing innodb

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之类的事情。我还需要时间戳索引吗?

1 个答案:

答案 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中有许多不同的值。