일반적으로 어떤 열이 좋은 인덱스를 만드나요?
"인덱스란 무엇이며 데이터베이스 내 쿼리를 최적화하기 위해 인덱스를 어떻게 사용할 수 있습니까?인덱스에 대해 알아보려고 하는데 인덱스 후보로는 어떤 컬럼이 좋을까요?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 indexing */
AND last_name='Iqbal' /* consider indexing */
"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 indexing */
WHERE
first_name='Tariq' /* consider indexing */
AND
last_name='Iqbal' /* consider indexing */
위의 쿼리 first_name에 따르면 last_name 열은 WHERE 절에 있으므로 인덱스를 작성할 수 있습니다.또한 국가 테이블의 country_id라는 추가 필드는 JOIN 절에 있으므로 인덱싱에 사용할 수 있습니다.따라서 WHERE 절 또는 JOIN 절의 모든 필드에서 인덱싱을 고려할 수 있습니다.
또한 다음 목록에서는 테이블에 인덱스를 작성할 때 항상 염두에 두어야 할 몇 가지 힌트를 제공합니다.
- WHERE 절과 ORDER BY 절에 필요한 열만 인덱싱하십시오.열을 풍부하게 인덱싱하면 몇 가지 단점이 발생합니다.
- MySQL의 "인덱스 접두사" 또는 "멀티 컬럼 인덱스" 기능을 활용해 보십시오.INDEX(first_name, last_name)와 같은 인덱스를 작성할 경우 INDEX(first_name)를 작성하지 마십시오.그러나 "인덱스 접두사" 또는 "복수 열 색인"이 모든 검색 사례에서 권장되는 것은 아닙니다.
- NOT NULL 속성은 인덱싱을 고려하는 열에 대해 NULL 값이 저장되지 않도록 사용합니다.
- --log-long-format 옵션을 사용하여 색인을 사용하지 않는 쿼리를 기록합니다.이렇게 하면 이 로그 파일을 검사하고 그에 따라 쿼리를 조정할 수 있습니다.
- EXPLINE 문을 사용하면 MySQL이 쿼리를 실행하는 방법을 알 수 있습니다.테이블이 어떻게 어떤 순서로 결합되었는지 보여줍니다.이는 최적화된 쿼리를 쓰는 방법과 열을 인덱싱해야 하는지 여부를 결정하는 데 매우 유용합니다.
업데이트 (2015년 2월 23일) :
인덱스(양호/불량)를 지정하면 삽입 및 업데이트 시간이 늘어납니다.
인덱스(인덱스 수 및 유형)에 따라 결과가 검색됩니다.색인 때문에 검색 시간이 증가한다면 그것은 잘못된 색인입니다.
모든 책에서 "색인 페이지"는 장 시작 페이지, 주제 페이지 번호 시작 페이지, 하위 주제 페이지 시작 페이지를 가질 수 있습니다.색인 페이지에 설명이 있으면 도움이 되지만 더 자세한 색인은 혼란스럽거나 겁을 줄 수 있습니다.인덱스에도 메모리가 있습니다.
인덱스 선택은 현명해야 합니다.모든 열에 색인이 필요한 것은 아닙니다.
어떤 사람들은 비슷한 질문에 다음과 같이 대답했습니다.좋은 지수가 뭔지 어떻게 알아?
기본적으로 데이터를 조회하는 방법에 따라 달라집니다.쿼리와 관련된 데이터 집합의 작은 하위 집합을 빠르게 식별하는 인덱스를 원합니다.데이터 스탬프로 쿼리하지 않으면 대부분 고유하더라도 인덱스가 필요하지 않습니다.특정 날짜 범위에서 발생한 이벤트만 가져오면 해당 이벤트를 원하는 것입니다.대부분의 경우 성별에 대한 지표는 무의미하지만, 모든 남성과 여성에 대한 통계만 얻는다면, 그것을 만드는 데 시간을 들일 가치가 있을지도 모릅니다.쿼리 패턴이 무엇인지, 검색 공간을 가장 좁히는 매개 변수에 액세스할 수 있습니다. 이것이 최상의 색인입니다.
작성하는 인덱스 종류도 고려하십시오.B-Tree는 대부분의 경우에 적합하며 범위 쿼리를 허용하지만 해시 인덱스는 바로 요점으로 이동합니다(범위 허용은 안 함).다른 유형의 인덱스에는 장단점이 있습니다.
행운을 빕니다.
이 모든 것은 테이블에 대해 어떤 질문을 할 것으로 예상하느냐에 따라 달라집니다.열 X에 대해 특정 값을 가진 모든 행을 묻는 경우 색인을 사용할 수 없는 경우 전체 테이블 검색을 수행해야 합니다.
색인은 다음과 같은 경우에 유용합니다.
- 하나 이상의 열이 고유성이 높습니다.
- 열에 대한 특정 값 또는 값의 범위를 자주 찾아야 합니다.
다음과 같은 경우에는 유용하지 않습니다.
- 테이블 내의 행 중 큰 %(10~20%)를 선택하고 있다.
- 추가 공간 사용이 문제입니다.
- 삽입 성능을 극대화하려고 합니다.테이블의 모든 인덱스는 데이터가 변경될 때마다 업데이트해야 하므로 삽입 및 업데이트 성능이 저하됩니다.
기본 키 열은 고유하고 행을 검색하는 데 자주 사용되므로 일반적으로 인덱싱에 적합합니다.
테이블에서 데이터를 추출하는 데 정기적으로 사용되는 열은 모두 인덱싱해야 합니다.
여기에는 다음과 같은 외부 키가 포함됩니다.
select * from tblOrder where status_id=:v_outstanding
설명 필드 -
select * from tblCust where Surname like "O'Brian%"
열은 고유할 필요가 없습니다.실제로 예외를 검색할 때 이진 인덱스에서 매우 우수한 성능을 얻을 수 있습니다.
select * from tblOrder where paidYN='N'
일반적으로(mssql을 사용하지 않기 때문에 특별히 주석을 달 수 없습니다) 기본 키는 양호한 인덱스를 만듭니다.이들은 고유하며 값이 지정되어 있어야 합니다.(또한 프라이머리 키는 인덱스가 매우 우수하기 때문에 보통 인덱스가 자동으로 생성됩니다.)
인덱스는 실질적으로 이진 검색을 허용하도록 정렬된 열의 복사본입니다(선형 검색보다 훨씬 빠름).데이터베이스 시스템은 특히 데이터가 단순한 숫자보다 더 복잡한 경우 검색 속도를 높이기 위해 다양한 방법을 사용할 수 있습니다.
처음에는 인덱스를 사용하지 않고 쿼리를 프로파일링하는 것이 좋습니다.특정 쿼리(예: 성별 사용자 검색)가 자주 실행되는 경우 관련 속성 및 프로필에 대한 색인을 다시 작성해 보십시오.쿼리의 속도가 현저하게 빨라지고 삽입 및 업데이트 속도가 거의 느려지지 않는 경우 인덱스를 유지합니다.
(죄송합니다만, 제가 다른 질문에서 언급한 내용을 반복하고 있다면, 이전에 접한 적이 없습니다.)
당신의 질문에 달려있습니다.예를 들어, 테이블에 거의 쓰기만 하는 경우 인덱스는 사용하지 않는 것이 가장 좋습니다. 인덱스는 쓰기 속도를 늦출 뿐 사용되지 않습니다.다른 테이블과 결합하는 데 사용하는 열은 인덱스에 적합합니다.
또한 누락된 인덱스 기능에 대해서도 읽어보십시오.데이터베이스에 대해 사용되는 실제 쿼리를 모니터하고 성능을 향상시켰을 인덱스를 알려줍니다.
기본 키는 항상 인덱스여야 합니다(MS SQL에 의해 자동으로 인덱싱되지 않았다면 놀랐을 것입니다).또한 열을 인덱싱해야 합니다.SELECT
또는ORDER
그 목적은 단일 값의 빠른 검색과 빠른 정렬입니다.
인덱싱의 유일한 실제 위험 요소too
인덱스를 모두 업데이트해야 하므로 많은 열이 큰 테이블의 행에 대한 변경 속도를 늦추고 있습니다.인덱싱할 항목을 잘 모르는 경우 가장 느린 쿼리 시간을 두고 가장 자주 사용되는 열을 확인한 후 인덱싱하십시오.그럼 얼마나 빠른지 보자.
오름차순 또는 내림차순으로 정렬된 숫자 데이터 유형은 여러 가지 이유로 좋은 색인입니다.첫째, 일반적으로 숫자는 문자열(varchar, char, nvarchar 등)보다 평가 속도가 빠릅니다.둘째, 값이 정렬되지 않은 경우 인덱스를 업데이트하기 위해 행 및/또는 페이지를 섞어야 할 수 있습니다.그건 추가 비용입니다.
SQL Server 2005를 사용하고 있으며 Unique Identifier(guid; 고유 식별자)를 사용하도록 설정하고 있으며 랜덤한 성질을 가질 필요가 없는 경우 순차적 고유 식별자 유형을 확인하십시오.
마지막으로 클러스터된 인덱스에 대해 말하자면 물리적 데이터의 종류에 대해 말하는 것입니다.클러스터된 인덱스로 문자열이 있는 경우 더 보기 흉해질 수 있습니다.
GUID 열은 인덱싱에 적합하지 않습니다.인덱스는 정렬(정수, 날짜 등)된 데이터 유형의 열에 가장 적합합니다.
열에 있는 데이터가 일반적으로 증가하는지는 중요하지 않습니다.열에 인덱스를 만들면 인덱스는 저장된 순서(비클러스터된 인덱스)에 신경 쓰지 않고 테이블의 실제 항목을 참조하는 자체 데이터 구조를 만듭니다.그런 다음 인덱스 데이터 구조에서 이진 검색을 수행하여 빠른 검색을 제공할 수 있습니다.
데이터를 물리적으로 정렬하는 "클러스터된 인덱스"를 만들 수도 있습니다.그러나 이러한 인덱스는 테이블당 하나만 가질 수 있는 반면, 비클러스터형 인덱스는 여러 개 있을 수 있습니다.
ol'의 경험칙은 WHERE, ORDER BY 및 GROUP BY 절에서 많이 사용되는 열이나 조인에서 자주 사용되는 것으로 보이는 열입니다.기본 키가 아니라 인덱스를 참조하고 있습니다.
'바닐라식'이라고 대답하는 것은 아니지만, 실제로 데이터에 액세스하는 방법에 따라 달라집니다.
GUID 를 사용하고 있는 경우는, 한층 더 고속이 됩니다.당신이 그 기록을 가지고 있다고 가정해 봅시다.
- 100
- 200
- 3000
- ....
Index(Binary Search)가 있으면 O(n)시간에서 순차적으로 검색하는 것이 아니라 O(lg n)시간 내에 원하는 레코드의 실제 위치를 찾을 수 있습니다.테이블에 어떤 레코드가 있는지 모르기 때문입니다.
최적의 인덱스는 테이블의 내용과 달성하려는 항목에 따라 달라집니다.
Members Social Security Number의 프라이머리 키를 가진 멤버 데이터베이스의 예를 들었다.어플리케이션의 priamry는 이와 같이 개인을 참조하기 때문에 SS를 선택하지만, 멤버의 성과 이름을 사용하는 검색 기능도 만들고 싶다고 생각하고 있습니다.그런 다음 이 두 개의 필드에 대한 인덱스를 만들 것을 제안합니다.
먼저 어떤 데이터를 조회할 것인지 확인한 후 인덱싱해야 할 데이터를 결정해야 합니다.
언급URL : https://stackoverflow.com/questions/107132/what-columns-generally-make-good-indexes
'programing' 카테고리의 다른 글
WPF에서 *를 사용하여 그리드 열의 너비를 프로그래밍 방식으로 설정 (0) | 2023.04.12 |
---|---|
SQL 뷰를 사용하는 좋은 이유는 무엇입니까? (0) | 2023.04.12 |
git은 왜 기본적으로 빨리 감기 병합을 실행합니까? (0) | 2023.04.12 |
UPDATE 문의 영향을 받는 행 수를 반환합니다. (0) | 2023.04.12 |
디폴트 WPF 컨트롤 템플릿은 어디서 구할 수 있나요? (0) | 2023.04.12 |