데이터베이스 인덱스, 사용 시 주의하세요!

4235 단어 databasesql
시작하기 전에 면책조항을 합시다 😉.

This is my current understanding of Database Index.
If there is any mistake that write that lead to misunderstanding, please let me know and I will update this post ASAP.



시작하자 🚀

데이터베이스 색인이란 무엇입니까?



데이터베이스 인덱스는 데이터베이스 내부의 데이터를 검색하는 데 도움이 되는 기본 제공 도구입니다. 인덱스는 쿼리 기록을 빠르게 찾습니다.

문제



이해를 돕기 위해 몇 가지 사용 사례를 만들어 보겠습니다. 예를 들어 id, full_name & gender가 있는 사용자 테이블이 있습니다.



해당 사용자 테이블에는 1000개의 행이 있습니다. 그 중 2명은 남성이고 나머지(998명)는 여성입니다.
남성 사용자를 찾아야 한다고 가정하면 다음과 같은 쿼리를 생성합니다SELECT * FROM users WHERE gender = 'male'.
해당 쿼리를 실행한 후 사용자 2명의 결과를 얻게 됩니다.

이면에서 데이터베이스 엔진은 1000개의 행을 모두 검색하여 2개의 행을 찾습니다.
예, 비효율적으로 들립니다. 그러나 이것이 데이터베이스 엔진이 작동하는 방식입니다. 😵

해결책은 무엇인가?



해결책은 데이터베이스 색인을 사용하는 것입니다. 💡
인덱스를 사용하면 데이터베이스 엔진이 선택한 인덱스를 기반으로 테이블을 매핑하는 일부 알고리즘을 만듭니다.

좋아요, 그래서 우리는 users 테이블 안에 gender 컬럼에 인덱스를 생성합니다.
다시 쿼리로 돌아가서 SELECT * FROM users WHERE gender = 'male' 를 실행하면 결과적으로 다시 2명의 사용자를 얻게 됩니다(물론!).

차이점은 바로 지금 데이터베이스 엔진이 2개의 행을 검색하여 해당 2개의 행을 찾는다는 것입니다.
이제 그 소리가 효율적입니다❗

하지만 기다려...



알고 나면 다음과 같은 생각이 있을 수 있습니다.

"let's create index for all of our column, so we can get quick result every time we search something 🤔"



맞습니다. 검색할 때마다 빠른 검색어를 얻을 수 있습니다.
그러나 그것을 과도하게 사용하지 마십시오. Index가 상승세를 보이더라도 Index도 하락세를 보입니다.

인덱스를 만들면 장면 데이터베이스 엔진이 데이터베이스에 추가 데이터를 기록합니다.

다시 사용자 테이블로 돌아가 보겠습니다. 계산은 다음과 같습니다.

2 index (1 for ID, 1 for gender) * 1000 rows = 2000
# PK is always get index


모든 열에 인덱스를 넣는다고 상상해보십시오.

4 index (ID, gender, full_name, created_at) * 1000 rows = 4000
# Thats only 4 columns.
# The more column we create, the more usage it will take when CREATE, UPDATE, DELETE, etc.


결론은 현명하게 사용하시기 바랍니다. 😇

보너스: 인덱스 생성 방법


  • PostgreSql

  • CREATE TABLE "customers" (
      "id" SERIAL PRIMARY KEY,
      "gender" varchar,
      "full_name" varchar,
      "created_at" timestamp
    );
    
    CREATE INDEX ON "customers" ("gender");
    


  • MySql

  • CREATE TABLE `customers` (
      `id` int PRIMARY KEY AUTO_INCREMENT,
      `gender` varchar(255),
      `full_name` varchar(255),
      `created_at` timestamp
    );
    
    CREATE INDEX `customers_index_0` ON `customers` (`gender`);
    

    좋은 웹페이지 즐겨찾기