7.1 지수가 나타나는 이유

데이터베이스가 없는 또 다른 중요한 것은 인덱스입니다.

user 테이블에 천만 명의 사용자가 있고 레벨이 90 이상인 모든 사용자를 표시하려는 상황을 상상해 보십시오. 이 쿼리는 작성하기 매우 간단합니다.

SELECT * FROM user WHERE level > 90

1분도 안 되어 요청을 작성했습니다. 그리고 SQL 서버에서 이 쿼리를 실행하는 데 얼마나 걸립니까? 그런 쿼리를 실행하려면 1000만 개의 레코드를 거쳐야 하고 레코드가 하나만 있어도 시간이 많이 걸린다.

Java에서 유사한 작업을 어떻게 수행합니까? 먼저 레벨별로 사용자 모음을 정렬한 다음 이진 검색을 사용하여 필요한 레코드를 매우 빠르게 찾을 수 있습니다. 나는 그것이 무엇인지 설명할 필요가 없기를 바랍니다.

좋습니다. 하지만 이제 등록 날짜가 2020년 이전인 사용자를 선택해야 한다면 어떻게 해야 할까요? 등록 날짜별로 다시 정렬하고 이진 검색을 사용하십시오.

예, 한 번이 아니라 자주 일부 필드에 대해 필터를 수행하면 이 필드별로 정렬된 데이터를 저장하는 것이 매우 유용할 것입니다.

그리고 서로 다른 필드로 동시에 정렬된 데이터를 저장하는 방법은 무엇입니까?

대답은 매우 간단합니다. 데이터 자체가 아니라 인덱스를 일부 전역 테이블에 저장해야 합니다.

id: 를 가진 10명의 사용자가 있다고 가정해 보겠습니다 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

그리고 레벨별로 정렬하기로 결정하면 ID 배열은 예를 들어 다음과 같습니다 {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

날짜순으로 정렬하면 예를 들어 다음과 같이 표시됩니다 {10, 1, 8, 7, 2, 3, 5, 9, 6}.

이러한 ID의 배열을 indexes 라고 합니다 . 요소 자체는 크므로 만지지 않습니다. Java에서는 객체를 건드리지 않고 해당 참조를 저장하지만 SQL에서는 실제 문자열을 건드리지 않고 번호를 저장합니다.

이것을 Java 코드로 다시 작성해 보겠습니다.

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

컬렉션 정렬은 실제 요소를 이동하는 것을 의미하지 않습니다. 컬렉션은 실제 개체를 저장하지 않고 해당 개체에 대한 링크를 저장합니다. SQL 테이블의 경우에도 마찬가지입니다. 실선은 스스로에게 거짓말을 하고 거짓말을 한다.

그리고 일부 필드에 대해 자주 선택해야 하는 경우 테이블에 다른 인덱스를 추가하고 (Java의 새 컬렉션과 유사) 테이블의 행을 정렬하고 정렬된 순서를 특수 인덱스 파일에 저장합니다.

Java 비교가 조금이나마 도움이 되었기를 바랍니다. 약간의 연습 - 인덱스를 사용하는 것이 가장 확실한 해결책이 될 것입니다.

7.2 테이블에 인덱스 추가

인덱스는 테이블을 생성하는 동안 즉시 지정하거나 나중에 추가할 수 있습니다. 가장 자주 발생하는 것은 두 번째 시나리오입니다. 테이블 크기가 커지고 데이터 샘플링이 느려지면 인덱스가 추가됩니다.

테이블에 인덱스를 추가하는 것은 매우 간단합니다.

ALTER TABLE table
    ADD INDEX index_name (column);

동시에 여러 열의 레코드를 자주 조회하는 경우 복합 인덱스를 지정할 수 있습니다. SQL은 여러 열을 사용하여 구성합니다.

복합 인덱스를 테이블에 추가하는 것도 매우 간단합니다.

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

인덱스는 많은 디스크 공간을 차지하므로 인덱스가 더 이상 필요하지 않으면 언제든지 제거할 수 있습니다.

ALTER TABLE table
    DROP INDEX index_name;

인덱스 자체는 데이터베이스의 숨겨진 부분입니다. 어떤 식으로든 쿼리 작성 형식에 영향을 주지 않습니다. 그들의 존재가 데이터 샘플링 속도를 높이고 추가 및 백업 속도를 늦추는 것입니다.

그러나 오늘날 세계에서 속도가 얼마나 중요한지와 디스크 공간이 얼마나 저렴한지를 고려하면 모든 경우에 인덱스를 자유롭게 추가할 수 있습니다. 관리자님 죄송합니다...