Programing

일반적으로 좋은 인덱스를 만드는 열은 무엇입니까?

lottogame 2020. 9. 16. 08:19
반응형

일반적으로 좋은 인덱스를 만드는 열은 무엇입니까?


" 인덱스 란 무엇이며 데이터베이스에서 쿼리를 최적화하기 위해 인덱스를 어떻게 사용할 수 있습니까? "에 대한 후속 조치로서, 인덱스 에 대해 배우려는 경우 어떤 열이 좋은 인덱스 후보입니까? 특히 MS SQL 데이터베이스의 경우?

인터넷 검색을 한 후 내가 읽은 모든 내용은 일반적으로 증가하고 고유 한 열이 좋은 인덱스 (MySQL의 auto_increment와 같은 것)를 만든다는 것을 암시합니다.이를 이해하지만 MS SQL을 사용하고 있으며 기본 키에 GUID를 사용하고 있습니다. 인덱스는 GUID 열에 도움이되지 않습니다.


인덱스는 쿼리 최적화 및 테이블에서 신속하게 결과를 검색하는 데 중요한 역할을 할 수 있습니다. 따라서 인덱싱 할 열을 선택하는 것이 가장 중요한 단계입니다. 인덱싱을 고려할 수있는 두 가지 주요 위치가 있습니다. WHERE 절에서 참조되는 열과 JOIN 절에서 사용되는 열입니다. 요컨대, 이러한 열은 특정 레코드를 검색하는 데 필요한 인덱싱되어야합니다. SELECT 쿼리가 아래와 같은 인덱스를 사용하는 buyers라는 테이블이 있다고 가정합니다.

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal'   /* consider to use index */

"buyer_id"는 SELECT 부분에서 참조되므로 MySQL은 선택한 행을 제한하는 데 사용하지 않습니다. 따라서 색인을 생성 할 필요가 없습니다. 아래는 위와 약간 다른 또 다른 예입니다.

SELECT
 buyers.buyer_id, /* no need to index */
 country.name    /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
 first_name='Tariq' /* consider to use index */
AND
 last_name='Iqbal' /* consider to use index */

위의 first_name 쿼리에 따르면 last_name 열은 WHERE 절에있는 그대로 인덱싱 할 수 있습니다. 또한 JOIN 절에 있으므로 country 테이블의 추가 필드 country_id를 인덱싱 할 수 있습니다. 따라서 인덱싱은 WHERE 절 또는 JOIN 절의 모든 필드에서 고려할 수 있습니다.

다음 목록은 테이블에 인덱스를 만들 때 항상 염두에 두어야 할 몇 가지 팁을 제공합니다.

  • WHERE 및 ORDER BY 절에 필요한 열만 인덱싱하십시오. 열을 많이 인덱싱하면 몇 가지 단점이 있습니다.
  • MySQL의 "인덱스 접두사"또는 "다중 열 인덱스"기능을 활용 해보십시오. INDEX (first_name, last_name)과 같은 인덱스를 생성하는 경우 INDEX (first_name)을 생성하지 마십시오. 그러나 "색인 접두사"또는 "다중 열 색인"은 모든 검색 사례에서 권장되지 않습니다.
  • 인덱싱을 고려하는 열에 대해 NOT NULL 속성을 사용하여 NULL 값이 저장되지 않도록하십시오.
  • --log-long-format 옵션을 사용하여 인덱스를 사용하지 않는 쿼리를 기록합니다. 이러한 방식으로이 로그 파일을 검사하고 그에 따라 쿼리를 조정할 수 있습니다.
  • EXPLAIN 문은 MySQL이 쿼리를 실행하는 방법을 표시하는 데 도움이됩니다. 테이블이 조인되는 방법과 순서를 보여줍니다. 이는 최적화 된 쿼리를 작성하는 방법과 열을 인덱싱해야하는지 여부를 결정하는 데 매우 유용 할 수 있습니다.

업데이트 (2015 년 2 월 23 일) :

모든 인덱스 (양호 / 불량)는 삽입 및 업데이트 시간을 증가시킵니다.

색인 (색인 수 및 유형)에 따라 결과가 검색됩니다. 색인으로 인해 검색 시간이 증가한다면 그것은 잘못된 색인입니다.

모든 책에서 "색인 페이지"는 장 시작 페이지, 주제 페이지 번호 시작, 하위 주제 페이지 시작을 가질 수 있습니다. 색인 페이지의 일부 설명이 도움이되지만 더 자세한 색인은 사용자를 혼란스럽게하거나 겁을 줄 수 있습니다. 인덱스에도 메모리가 있습니다.

인덱스 선택은 현명해야합니다. 모든 열에 색인이 필요한 것은 아닙니다.


일부 사람들은 여기에서 비슷한 질문에 답했습니다. 좋은 인덱스가 무엇인지 어떻게 알 수 있습니까?

기본적으로 데이터를 쿼리하는 방법에 따라 다릅니다. 쿼리와 관련된 데이터 세트의 작은 하위 집합을 빠르게 식별하는 색인이 필요합니다. 날짜 기록으로 쿼리하지 않는 경우 대부분 고유 한 경우에도 색인이 필요하지 않습니다. 특정 날짜 범위에서 발생한 이벤트를 얻는 것뿐이라면 확실히 원합니다. 대부분의 경우 성별에 대한 지표는 무의미합니다.하지만 모든 남성에 대한 통계를 얻고 별도로 모든 여성에 대한 통계를 얻는다면 시간을내는 것이 가치가있을 수 있습니다. 쿼리 패턴이 무엇인지 파악하고 어떤 매개 변수에 액세스하여 검색 공간을 가장 많이 좁 히면 이것이 최상의 인덱스입니다.

또한 만드는 인덱스의 종류를 고려하십시오. B- 트리는 대부분의 작업에 적합하고 범위 쿼리를 허용하지만 해시 인덱스는 요점을 바로 알려줍니다 (하지만 범위는 허용하지 않음). 다른 유형의 인덱스에는 다른 장단점이 있습니다.

행운을 빕니다!


그것은 모두 테이블에 대해 어떤 쿼리를 기대하는지에 달려 있습니다. 열 X에 대해 특정 값을 가진 모든 행을 요청하면 인덱스를 사용할 수없는 경우 전체 테이블 스캔을 수행해야합니다.

인덱스는 다음과 같은 경우에 유용합니다.

  • 열은 고유성이 높습니다.
  • 열에 대한 특정 값 또는 값 범위를 자주 찾아야합니다.

다음과 같은 경우에는 유용하지 않습니다.

  • 테이블에있는 행의 큰 % (> 10-20 %)를 선택합니다.
  • 추가 공간 사용이 문제입니다.
  • You want to maximize insert performance. Every index on a table reduces insert and update performance because they must be updated each time the data changes.

Primary key columns are typically great for indexing because they are unique and are often used to lookup rows.


In general (I don't use mssql so can't comment specifically), primary keys make good indexes. They are unique and must have a value specified. (Also, primary keys make such good indexes that they normally have an index created automatically.)

An index is effectively a copy of the column which has been sorted to allow binary search (which is much faster than linear search). Database systems may use various tricks to speed up search even more, particularly if the data is more complex than a simple number.

My suggestion would be to not use any indexes initially and profile your queries. If a particular query (such as searching for people by surname, for example) is run very often, try creating an index over the relevate attributes and profile again. If there is a noticeable speed-up on queries and a negligible slow-down on insertions and updates, keep the index.

(Apologies if I'm repeating stuff mentioned in your other question, I hadn't come across it previously.)


Any column that is going to be regularly used to extract data from the table should be indexed.

This includes: foreign keys -

select * from tblOrder where status_id=:v_outstanding

descriptive fields -

select * from tblCust where Surname like "O'Brian%"

The columns do not need to be unique. In fact you can get really good performance from a binary index when searching for exceptions.

select * from tblOrder where paidYN='N'

It really depends on your queries. For example, if you almost only write to a table then it is best not to have any indexes, they just slow down the writes and never get used. Any column you are using to join with another table is a good candidate for an index.

Also, read about the Missing Indexes feature. It monitors the actual queries being used against your database and can tell you what indexes would have improved the performace.


A GUID column is not the best candidate for indexing. Indexes are best suited to columns with a data type that can be given some meaningful order, ie sorted (integer, date etc).

It does not matter if the data in a column is generally increasing. If you create an index on the column, the index will create it's own data structure that will simply reference the actual items in your table without concern for stored order (a non-clustered index). Then for example a binary search can be performed over your index data structure to provide fast retrieval.

It is also possible to create a "clustered index" that will physically reorder your data. However you can only have one of these per table, whereas you can have multiple non-clustered indexes.


Your primary key should always be an index. (I'd be surprised if it weren't automatically indexed by MS SQL, in fact.) You should also index columns you SELECT or ORDER by frequently; their purpose is both quick lookup of a single value and faster sorting.

The only real danger in indexing too many columns is slowing down changes to rows in large tables, as the indexes all need updating too. If you're really not sure what to index, just time your slowest queries, look at what columns are being used most often, and index them. Then see how much faster they are.


Numeric data types which are ordered in ascending or descending order are good indexes for multiple reasons. First, numbers are generally faster to evaluate than strings (varchar, char, nvarchar, etc). Second, if your values aren't ordered, rows and/or pages may need to be shuffled about to update your index. That's additional overhead.

If you're using SQL Server 2005 and set on using uniqueidentifiers (guids), and do NOT need them to be of a random nature, check out the sequential uniqueidentifier type.

Lastly, if you're talking about clustered indexes, you're talking about the sort of the physical data. If you have a string as your clustered index, that could get ugly.


It should be even faster if you are using a GUID. Suppose you have the records

  1. 100
  2. 200
  3. 3000
  4. ....

If you have an index(binary search, you can find the physical location of the record you are looking for in O( lg n) time, instead of searching sequentially O(n) time. This is because you dont know what records you have in you table.


The ol' rule of thumb was columns that are used a lot in WHERE, ORDER BY, and GROUP BY clauses, or any that seemed to be used in joins frequently. Keep in mind I'm referring to indexes, NOT Primary Key

Not to give a 'vanilla-ish' answer, but it truly depends on how you are accessing the data


Best index depends on the contents of the table and what you are trying to accomplish.

Taken an example A member database with a Primary Key of the Members Social Security Numnber. We choose the S.S. because the application priamry referes to the individual in this way but you also want to create a search function that will utilize the members first and last name. I would then suggest creating a index over those two fields.

You should first find out what data you will be querying and then make the determination of which data you need indexed.

참고URL : https://stackoverflow.com/questions/107132/what-columns-generally-make-good-indexes

반응형