Обсуждение: Single vs. multiple indexes

Поиск
Список
Период
Сортировка

Single vs. multiple indexes

От
Tom Lane
Дата:
Question: what's the difference between making a single index covering
multiple fields of the underlying table, and making a separate index
for each of the fields?

I understand that the semantics are different if I create a UNIQUE
index: a unique index on a field enforces that every record in the table
have a different value of that field, but a unique index on a set of
fields only enforces that the combination of all those fields be unique
in each record.

Leaving that aside, what are the performance implications?  Does one
structure support fast execution of query types that the other doesn't,
and if so which one's better for what?  Is a single index cheaper to
update than multiple indexes?  Does it save disk space?

            regards, tom lane

Re: [SQL] Single vs. multiple indexes

От
Bruce Momjian
Дата:
> Question: what's the difference between making a single index covering
> multiple fields of the underlying table, and making a separate index
> for each of the fields?
>
> I understand that the semantics are different if I create a UNIQUE
> index: a unique index on a field enforces that every record in the table
> have a different value of that field, but a unique index on a set of
> fields only enforces that the combination of all those fields be unique
> in each record.
>
> Leaving that aside, what are the performance implications?  Does one
> structure support fast execution of query types that the other doesn't,
> and if so which one's better for what?  Is a single index cheaper to
> update than multiple indexes?  Does it save disk space?
>

Good question.  The optimizer can only use only one index in a query, so
if you create five indexes, the optimizer will pick the best one to use,
and disregard the rest.  If you create one index with five fields, it
will use as much of the index as it can.  If you restrict on the first
field of the index, it will use only that part of the index.  If you
restrict on the first three fields, it will use all three parts,
resulting in better performance than just having an index on the first
field.

If you restrict only on the second field of the index, the index is
useless and will not be used.

Hope this answers the question.

--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
  +  If your life is a hard drive,     |  (610) 353-9879(w)
  +  Christ can be your backup.        |  (610) 853-3000(h)

Re: [SQL] Single vs. multiple indexes

От
Jeff Aitken
Дата:
Bruce Momjian writes:
> Good question.  The optimizer can only use only one index in a query, so
> if you create five indexes, the optimizer will pick the best one to use,
> and disregard the rest.  If you create one index with five fields, it
> will use as much of the index as it can.  If you restrict on the first
> field of the index, it will use only that part of the index.  If you
> restrict on the first three fields, it will use all three parts,
> resulting in better performance than just having an index on the first
> field.
>
> If you restrict only on the second field of the index, the index is
> useless and will not be used.
>

Just to be sure I understand what you're saying here, let's assume
I've got a table with three integer fields a, b, and c.  I can do
one of two things:

1. Create an index on (a), an index on (b), and an index on (c).
2. Create an index on (a, b, c).

Now let's assume I perform a query that references b only.  In this
case, if I understand you correctly, method #1 above is better,
because the index in method #2 will not be used.

However, if I perform a query that references a and b, then method
#2 would be better, because the composite index will be used,
whereas in method #1, only one of the two relevant indices would be
chosen?


--Jeff


Re: [SQL] Single vs. multiple indexes

От
Bruce Momjian
Дата:
> Bruce Momjian writes:
> > Good question.  The optimizer can only use only one index in a query, so
> > if you create five indexes, the optimizer will pick the best one to use,
> > and disregard the rest.  If you create one index with five fields, it
> > will use as much of the index as it can.  If you restrict on the first
> > field of the index, it will use only that part of the index.  If you
> > restrict on the first three fields, it will use all three parts,
> > resulting in better performance than just having an index on the first
> > field.
> >
> > If you restrict only on the second field of the index, the index is
> > useless and will not be used.
> >
>
> Just to be sure I understand what you're saying here, let's assume
> I've got a table with three integer fields a, b, and c.  I can do
> one of two things:
>
> 1. Create an index on (a), an index on (b), and an index on (c).
> 2. Create an index on (a, b, c).
>
> Now let's assume I perform a query that references b only.  In this
> case, if I understand you correctly, method #1 above is better,
> because the index in method #2 will not be used.
>
> However, if I perform a query that references a and b, then method
> #2 would be better, because the composite index will be used,
> whereas in method #1, only one of the two relevant indices would be
> chosen?

Exactly.

--
Bruce Momjian                          |  830 Blythe Avenue
maillist@candle.pha.pa.us              |  Drexel Hill, Pennsylvania 19026
  +  If your life is a hard drive,     |  (610) 353-9879(w)
  +  Christ can be your backup.        |  (610) 853-3000(h)