что такое покрытый индекс?

<p>я только что услышал термин покрытый индекс в некотором обсуждении базы данных - что это значит?</p>

<p><em> индекс покрытия </em> - это индекс, который содержит все и, возможно, больше столбцов, необходимых для вашего запроса.</p><p>например, это:</p><pre><code>select * from tablename where criteria </code></pre><p>обычно будет использовать индексы для ускорения разрешения того, какие строки извлекать, используя <em> критерии </em>, но затем он перейдет к полной таблице для извлечения строк.</p><p>однако, если индекс содержал столбцы <em> column1, column2 </em> и <em> column3 </em>, тогда этот sql:</p><pre><code>select column1, column2 from tablename where criteria </code></pre><p>и, при условии, что этот конкретный индекс может быть использован для ускорения разрешения того, какие строки извлекать, индекс уже содержит значения интересующих вас столбцов, поэтому ему не нужно идти в таблицу для получения строк. , но может выдавать результаты непосредственно из индекса.</p><p>это также можно использовать, если вы видите, что типичный запрос использует 1-2 столбца, чтобы определить, какие строки, а затем обычно добавляет еще 1-2 столбца, может быть полезно добавить эти дополнительные столбцы (если они одинаковы во всем ) к индексу, чтобы обработчик запросов мог получить все из самого индекса.</p><p>вот <a href="http://www.devx.com/dbzone/article/29530">статья: покрытие индекса повышает производительность запросов sql server</a> по теме.</p>

<p>индекс покрытия - это обычный индекс. он называется "покрытие", если он может удовлетворить запрос без необходимости анализа данных.</p><p>пример:</p><pre><code>create table mytable ( id int identity primary key, foo int ) create nonclustered index index1 on mytable(id, foo) select id, foo from mytable -- all requested data are covered by index </code></pre><p>это один из самых быстрых способов получения данных с сервера sql.</p>

<p>допустим, у вас есть простая таблица с приведенными ниже столбцами, здесь вы только что проиндексировали id:</p><pre><code>id (int), telephone\_number (int), name (varchar), address (varchar) </code></pre><p>представьте, что вам нужно выполнить приведенный ниже запрос и проверить, использует ли он индекс и работает ли он эффективно без вызовов ввода-вывода или нет. помните, что вы создали индекс только для <code>id</code>.</p><pre><code>select id from mytable where telephone\_number = '55442233'; </code></pre><p>когда вы проверяете производительность по этому запросу, вы разочаровываетесь, так как <code>telephone\_number</code> не проиндексирован, поэтому необходимо извлекать строки из таблицы с помощью вызовов ввода-вывода. таким образом, это не индексируемое покрытие, поскольку в запросе есть столбец, который не индексируется, что приводит к частым вызовам ввода-вывода.</p><p>чтобы сделать его покрытым индексом, вам нужно создать составной индекс для <code>(id, telephone\_number)</code>.</p><p>для получения более подробной информации, пожалуйста, обратитесь к этому блогу: <a href="https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/">https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/</a> </p>

<p>покрывающие индексы - это индексы, которые "покрывают" все столбцы, необходимые из определенной таблицы, устраняя необходимость доступа к физической таблице вообще для данного запроса/операции.</p><p>поскольку индекс содержит желаемые столбцы (или их расширенный набор), доступ к таблице можно заменить поиском или сканированием индекса, что обычно происходит намного быстрее.</p><p>колонны для покрытия:</p><ul> <li>параметризованные или статические условия; столбцы ограничены параметризованным или постоянным условием.</li> <li>объединить столбцы; столбцы, динамически используемые для соединения</li> <li>выбранные столбцы; ответить на выбранные значения.</li> </ul><p>несмотря на то, что закрывающие индексы часто могут принести хорошую выгоду для извлечения, они действительно несколько увеличивают накладные расходы на вставку/обновление; из-за необходимости писать дополнительные или большие строки индекса при каждом обновлении.</p><h2>индексы покрытия для объединенных запросов</h2><p>индексы покрытия, вероятно, наиболее ценны в качестве метода производительности для объединенных запросов. это связано с тем, что объединенные запросы являются более дорогостоящими и более вероятными, чем извлечение из одной таблицы, с высокой стоимостью.</p><ul> <li>в объединенном запросе закрывающие индексы должны рассматриваться для каждой таблицы.</li> <li>каждый "покрывающий индекс" удаляет физический доступ к таблице из плана и заменяет его доступом только по индексу.</li> <li>исследуйте план затрат и поэкспериментируйте с тем, какие таблицы наиболее целесообразно заменить на покрывающий индекс.</li> <li>таким образом, мультипликативная стоимость больших планов соединения может быть значительно уменьшена.</li> </ul><p>например:</p><pre><code>select oi.title, c.name, c.address from porderitem poi join porder po on po.id = poi.fk\_order join customer c on c.id = po.fk\_customer where po.orderdate > ? and po.status = 'shipping'; create index porder\_custitem on porder (orderdate, id, status, fk\_customer); </code></pre><p>увидеть:</p><ul> <li> <a href="http://literatejava.com/sql/covering-indexes-query-optimization/">http://literatejava.com/sql/covering-indexes-query-optimization/</a> </li> </ul>