Когда добавлять индекс для объединяемых таблиц - PullRequest
3 голосов
/ 15 января 2010

У меня есть таблица mysql с 9 миллионами записей, для которых не установлены индексы.Мне нужно присоединить это к другой таблице на основе общего идентификатора.Я собираюсь добавить индекс к этому идентификатору, но у меня также есть другие поля в предложении select и , где .

Должен ли я добавить индекс во все поля в предложении , где ?

А как насчет полей в предложении select ?Должен ли я создать один индекс для всех полей или индекс для каждого поля?

Обновить - Добавлены таблицы и запрос

Вот запрос - мне нужно получить числопродаж, названия товара и идентификатора товара по товарам на основе названия магазина и идентификатора магазина (название магазина и идентификатор сами по себе не являются уникальными)1023 *

и таблица предметов:

+--------------------+------------------------------+------+-----+---------+-------+
| Field              | Type                         | Null | Key | Default | Extra |
+--------------------+------------------------------+------+-----+---------+-------+
| ItemId             | bigint(20) unsigned          | NO   | PRI | NULL    |       |
| ProductCode        | bigint(20) unsigned          | NO   |     | NULL    |       |
| ItemName           | varchar(100)                 | NO   |     | NULL    |       |
| StoreName          | varchar(100)                 | NO   | PRI | NULL    |       |
+--------------------+------------------------------+------+-----+---------+-------+

Ответы [ 3 ]

4 голосов
/ 15 января 2010

Вы должны проиндексировать все поля, которые будут искать в ведущей таблице в предложении WHERE и в ведомой таблице в предложениях WHERE и JOIN.

Создание индексов для покрытия все поля, использованные в запросе (включая пункты SELECT и ORDER BY), также помогут, так как поиск таблиц не потребуется.

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

Обновление:

Ваш запрос вернет самое большее 1 строку с 1 в качестве COUNT(*)

Это выберет продажу с указанным StoreID (который является PRIMARY KEY), и присоединится к элементам на itemId продажи и получит StoreName (эта комбинация PRIMARY KEYтоже).

Это соединение либо завершается успешно (возвращает 1 строку), либо завершается неудачно (не возвращает строки).

Если это удастся, COUNT(*) будет 1.

Если это действительно то, что вы хотите, то ваша таблица индексируется нормально.

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

Обновление 2:

  1. Создание составного индекса для sales (storeId, itemId)

  2. Убедитесь, что вы PRIMARY KEY на items определены как (StoreName, ItemId) (в таком порядке).

    Если определено PKкак (ItemID, StoreName), создать индекс для items (StoreName, ItemID).

1 голос
/ 16 января 2010

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

9 миллионов строк достаточно, чтобы индексы имели большое значение, но не настолько, чтобы вы не могли немного повозиться.

Необработанным решением было бы создание индексов для items (storeid), items (itemid, storename), items (storename, itemid), sales (itemid), sales (storeid), продаж (itemid, storeid) и продаж storeid, itemid) затем отбросьте неиспользуемые индексы.

C.

0 голосов
/ 15 января 2010

Индексация отличная - при использовании в правильной форме. Помните, индексы должны быть проиндексированы.

Сконцентрируйте свои индексы на первичных общих ключах, а также на полях, для которых требуется сравнение тяжелых данных и общих данных, таких как буквенные поля и диапазоны дат.

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

...