Индекс с одним столбцом/многостолбцом, что лучше?

У меня есть одна плохо работающая процедура с парой запросов.

Я определил несколько запросов к временным таблицам, которые выполняют сканирование временной таблицы. Я решил добавить индекс во временную таблицу, чтобы избежать сканирования таблицы. Я заметил, что в предложении where используется несколько столбцов временной таблицы. Однако я не уверен, следует ли мне включать все столбцы в один индекс (составной индекс) или несколько индексов с одним столбцом в каждом индексе, чтобы получить максимальную производительность.

База данных DB2


person yura    schedule 16.06.2011    source источник
comment
Лучше бы выложили свою процедуру.   -  person Joe Ratzer    schedule 16.06.2011


Ответы (2)


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

Если предложение where для первого ограничивающего столбца уже отбрасывает, например, 90% строк, а следующее сократит только несколько сотен строк, не стоит включать ресурсы в индекс. Всегда имейте в виду, что движок базы данных сначала работает с первым столбцом составного индекса, а затем переходит к следующим. Если ваши запросы имеют столбцы в другом порядке, индекс может даже начать замедлять ваши запросы.

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

person user918176    schedule 17.09.2011

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

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

Допустим, у вас есть INDEX nameIdx (last_name,first_name), созданный на тестовой таблице.

Поэтому индекс nameIdx используется для поиска в следующих запросах:

SELECT * FROM test WHERE last_name='Widenius';

SELECT * FROM test
  WHERE last_name='Widenius' AND first_name='Michael';

SELECT * FROM test
  WHERE last_name='Widenius'
  AND (first_name='Michael' OR first_name='Monty');

где имя nameIdx не используется для поиска в следующих запросах:

SELECT * FROM test WHERE first_name='Michael';

SELECT * FROM test
  WHERE last_name='Widenius' OR first_name='Michael';

для более подробной информации см. URL

резюме этого: если вы используете столбцы в предложении where, как указано в порядке индекса (слева направо), то это лучше, чем индекс с одним столбцом

person Shirishkumar Bari    schedule 16.04.2014