Индексирование столбца с повторяющимися значениями - PullRequest
0 голосов
/ 20 февраля 2019

Рассмотрим эти таблицы:

seed (seedid, seedname) # PK-(seedid) 
stock (seedid, stk, storeid)  # PK-(seedid,storeid), FK-(storeid)
#InnoDB

stock: 
      seedid, stk, storeid
         1    12     81
         2    13     81
         3    14     81

         1    12     82
         2    11     82
         3    13     82
         4    12     82

Query -> select stk from stock where seedid = 'aaa' and storeid = 'yyy'.

Таблица stock представляет запасы нескольких магазинов, поэтому storeid будет повторяться.

Как индексировать, таблица stock, учитывая, что он будет часто запрашиваться с использованием storeid?

Первичные ключи как автоматически проиндексированные, а поскольку (seedid,storeid) уже является Первичным ключом, нет необходимости дополнительно его индексировать?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Исходя из неполной спецификации, я бы сделал это:

   CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)

Этот индекс будет удовлетворять требованию индекса с storeid в качестве ведущего столбца.(И мы знаем, что будет иметь это требование, если это InnoDB, а storeid - это внешний ключ.)

С такой короткой строкой таблицы я бы пошел вперед и сделал бы ее индексом покрытия и включил бы всеколонн.Тогда запросы могут быть выполнены непосредственно со страниц индекса без поиска страниц данных в базовой таблице.

Поскольку мы знаем, что (seedid,storeid) уникален (задан как ПЕРВИЧНЫЙ КЛЮЧ), мы знаем, что (storeid,seedid) такжеуникальный, поэтому мы могли бы также объявить индекс УНИКАЛЬНЫМ.


Есть и другие варианты;нам не нужно создавать этот индекс выше.Мы могли бы просто сделать это вместо этого:

   CREATE INDEX stock_IX2 ON stock (storeid)

Но это займет примерно столько же места и не будет таким же полезным для максимально возможного количества запросов.


Вторичный индексбудет содержать первичный ключ таблицы;так что второй индекс будет включать столбец seedid, учитывая ОСНОВНОЙ КЛЮЧ таблицы.То есть индекс эквивалентен этому:

   CREATE INDEX stock_IX3 ON stock (storeid,seedid)

И мы знаем, что комбинация этих двух столбцов уникальна, поэтому мы можем включить ключевое слово UNIQUE

   CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)

Если мы это сделаемОБЪЯСНЕНИЕ по запросу вида

  EXPLAIN
  SELECT t.storeid
       , t.seedid
       , t.stk 
    FROM stock t 
   WHERE t.storeid = 'foo'

мы, вероятно, увидим операцию сканирования диапазона по вторичному индексу;но получение значения столбца stk потребует поиска страниц данных в базовой таблице.Включение столбца stk во вторичный индекс сделает индекс , охватывающим индекс для запроса.С индексом, первым рекомендованным в ответе, мы ожидаем, что вывод EXPLAIN покажет «Использование индекса».

0 голосов
/ 20 февраля 2019

Если seedid, storeid установлен как первичный ключ, то у него уже есть уникальный индекс.Однако запросы могут использовать только один индекс за раз.Так что, если вы делаете регулярные запросы, например, где «seedid = 3 и storeid = 5», этот индекс будет использоваться.Но если вы просто используете «где storeid = 5», он может не использовать индекс.(Вы можете использовать «объяснение» перед вашим запросом, чтобы увидеть, какие индексы собирается использовать mysql.)

Таким образом, вы хотите индекс, который охватывает столбцы, которые необходимо регулярно запрашивать в предложении where.

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