Избыточный индекс MySQL? - PullRequest
1 голос
/ 14 июля 2011
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, Timestamp), если я когда-нибудь выполню запрос только для tickerID.

Иногда я хотел бы делать отчеты EOD, чтобы я мог просто сделать что-то вроде SELECT * WHERE Timestamp > Today() - 1 day или что-то в этом роде. Нужен ли мне также индекс временной метки?

1 Ответ

0 голосов
/ 14 июля 2011

Этот индекс на tickerId, timestamp может использоваться всеми запросами, которые могут использовать индекс только на tickerId.

Однако для такого запроса:

SELECT  *
FROM    mytable
WHERE   Timestamp > Today() - 1

anиндекс на (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.

много разных значений.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...