роль индекса в производительности в MySQL - PullRequest
0 голосов
/ 15 ноября 2010

почему определение индекса для таблиц mysql повышает производительность в запросах, имеющих соединение?

Ответы [ 3 ]

6 голосов
/ 15 ноября 2010

Если вас интересует конкретная тема в книге, вы переходите в конец книги и находите ее в алфавитном порядке в указателе. Индекс говорит вам номер страницы, где обсуждается тема. Затем вы переходите прямо к интересующим вас страницам. Гораздо быстрее, чем чтение всей книги.

То же самое в базе данных. Индекс означает, что вы можете переходить к объединяющимся строкам, а не сканировать каждую строку в таблице в поисках совпадения.

Посмотрите, как работает кластерный индекс (http://msdn.microsoft.com/en-us/library/ms177443.aspx).. Вы можете иметь один из них для каждой таблицы.

В этой статье объясняется, как работает некластеризованный индекс (http://msdn.microsoft.com/en-us/library/ms177484.aspx).. Их может быть столько, сколько вы хотите.

Обе эти статьи посвящены Microsoft Sql Server, но теория индексов одинакова во всех системах управления реляционными базами данных.

С индексами связаны затраты. Каждый раз, когда вставка / обновление выполняется в таблице, возможно, обновленный индекс (ы) также должен быть обновлен. И, конечно, индексы занимают место - но это не является проблемой для большинства из нас. Таким образом, вам необходимо сбалансировать преимущества производительности от более быстрых объединений или фильтрации с затратами на вставки и обновления.

В качестве руководства обычно требуется индекс, соответствующий каждому из столбцов, включенных в объединение или условие where:

SELECT 
    * 
FROM 
    Customer 
WHERE 
    RegistrationDate > @registrationDate 
    AND RegistrationCountry = @registrationCountry;

Таким образом, индекс в таблице Customer, включающей столбцы RegistrationDate и RegistrationCountry, ускорит этот запрос. Поскольку мы используем «>» в ​​нашем запросе, это было бы хорошим кандидатом для кластеризованного индекса (первая статья показывает, что кластеризованный индекс физически упорядочивает данные в порядке индекса, поэтому запросы диапазона могут очень быстро изолировать диапазон индекса ).

SELECT 
    * 
FROM 
    Customer c
    INNER JOIN Order o
        ON o.CustomerID = c.CustomerID
        AND o.OrderType = @orderType

Здесь нам нужен индекс для таблицы Customer, содержащей столбец CustomerID. И нам нужен индекс для таблицы Order, содержащей столбцы CustomerID и OrderType. Тогда обеим сторонам объединения не нужно будет выполнять сканирование таблицы.

Как правило, существует лишь небольшое количество способов запроса данных из таблицы, поэтому вы не получите перегрузку индекса. Множество индексов иногда является признаком того, что ваши таблицы имеют смешанные проблемы и могут быть нормализованы

1 голос
/ 15 ноября 2010

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

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

Я обнаружил, что иногда может быть значительно быстрее заменить запрос JOIN двумя запросами меньшего размера, а затем соединить их в PHP или на любом языке, называемом MySQL.Поэтому попробуйте оба варианта и определите время, которое лучше для конкретной ситуации, но имейте в виду, что «самое быстрое» решение может измениться с увеличением размера базы данных.

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