Обсуждение: Single vs. multiple indexes
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
> 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)
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
> 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)