programing

MySQL 테이블에 인덱스를 추가하려면 어떻게 해야 합니까?

bestcode 2022. 11. 27. 11:34
반응형

MySQL 테이블에 인덱스를 추가하려면 어떻게 해야 합니까?

저는 약 150,000줄의 데이터가 있는 매우 큰 MySQL 테이블을 가지고 있습니다.지금 제가 도망가려고 하면

SELECT * FROM table WHERE id = '1';

ID 필드가 프라이머리 인덱스이기 때문에 코드는 정상적으로 실행됩니다.그러나 최근 프로젝트 개발을 위해 다른 필드별로 데이터베이스를 검색해야 합니다.예를 들어 다음과 같습니다.

SELECT * FROM table WHERE product_id = '1';

이 필드는 이전에 인덱싱되지 않았습니다.단, 추가했으므로 mysql은 필드를 인덱싱하지만 위의 쿼리를 실행하려고 하면 실행 속도가 매우 느립니다.이미 product_id 필드를 추가한 경우 EXPLINE 쿼리에서 인덱스가 없음을 알 수 있습니다.그 결과 쿼리는 1개의 행을 반환하는 데 20분에서 30분이 걸립니다.

자세한 설명 결과는 다음과 같습니다.

| id | select_type | table | type | possible_keys| key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
|  1 | SIMPLE      | table | ALL  | NULL         | NULL | NULL    | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+

방금 확인했는데 ID 필드는 INT로 저장되고 PRODUCT_ID 필드는 VARCHAR로 저장됩니다.이것이 문제의 원인일 수 있습니까?

ALTER TABLE `table` ADD INDEX `product_id_index` (`product_id`)

비교하지 않다integer로.stringsMySQL에 있습니다.한다면idint따옴표를 삭제합니다.

ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);

이 구문을 사용하여 인덱스를 추가하고 인덱스 종류(HASH 또는 BTRE)를 제어할 수 있습니다.

create index your_index_name on your_table_name(your_column_name) using HASH;

또는

create index your_index_name on your_table_name(your_column_name) using BTREE;

BTREE 인덱스와 해시 인덱스의 차이에 대해서는http://http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html 를 참조해 주세요.

두 가지 유형의 인덱스를 추가할 수 있습니다. 기본 키를 정의하면 MySQL이 기본 키로 간주합니다.

설명.

인덱스로서의 프라이머리 키

예를 들어,tbl_student테이블과 당신이 원하는 것student_id프라이머리 키로서

ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)

위 문장은 기본 키를 추가합니다.즉, 인덱스 값은 고유해야 하며 NULL일 수 없습니다.

인덱스 이름 지정

ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)

위의 문장은 다음과 같은 일반 인덱스를 생성합니다.student_index이름.

고유 인덱스 생성

ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)

여기서,student_unique_index는 student_id에 할당된 인덱스 이름으로 값이 고유해야 하는 인덱스를 만듭니다(여기서는 늘을 사용할 수 있습니다).

전체 텍스트 옵션

ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)

위의 문장은 다음을 포함하는 전체 텍스트 색인 이름을 만듭니다.student_fulltext_indexMyISAM Mysql Engine이 필요합니다.

인덱스를 삭제하려면 어떻게 해야 합니까?

DROP INDEX `student_index` ON `tbl_student`

사용 가능한 인덱스를 확인하는 방법

SHOW INDEX FROM `tbl_student`

여러 필드 인덱스를 사용하면 쿼리 성능이 크게 향상될 수 있습니다.위의 예에서는 Product를 상정하고 있습니다.ID는 조회할 수 있는 유일한 필드이지만 쿼리에서는 "Product"라고 표시됩니다.ID = 1 및 범주 = 7이면 다중 열 인덱스가 도움이 됩니다.이것은, 다음의 방법으로 실현됩니다.

ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)

또한 인덱스는 쿼리 필드의 순서와 일치해야 합니다.확장 예에서 인덱스는 (제품)이어야 합니다.ID, Category)는 그 반대입니다.

지표를 가지고 있다고 하면 설명이 다르게 되어 있습니다.다만, 실제로 실행했을 경우는, 다음과 같이 속행합니다.

열에 인덱스가 있고 MySQL이 사용하지 않기로 결정한 경우 다음과 같은 이유로 인덱스를 사용할 수 있습니다.

  1. MySQL이 사용하기에 더 적합하다고 생각하는 쿼리에 다른 인덱스가 있으며 하나만 사용할 수 있습니다.일반적인 검색 방법이 여러 열의 값을 사용하는 경우 솔루션은 일반적으로 여러 열에 걸쳐 있는 인덱스입니다.
  2. MySQL은 일치하는 행이 너무 많다고 판단하고 테이블스캔이 더 빠를 수 있다고 생각합니다.않으면 렇렇 if if if an an if if if if if if, if if ifANALYZE TABLEselp.mailbanda.
  3. 좀 더 복잡한 질문에서는 어떤 이유로 인해 현재 요구 사항에 맞지 않는 매우 인텔리전트한 생각의 부두(voodoo)를 바탕으로 사용하지 않기로 결정합니다.

(2) 또는 (3)의 경우 인덱스 힌트 systax를 사용하여 MySQL이 인덱스를 사용하도록 유도할 수 있지만, 실제로 인덱스를 사용할 때 성능이 향상되는지 여부를 확인하기 위해 몇 가지 테스트를 수행합니다.

더 나은 옵션은 CREATE TABLE 쿼리 중에 직접 제약을 추가하는 것입니다(테이블에 대한 정보가 있다고 가정).

CREATE TABLE products(
    productId INT AUTO_INCREMENT PRIMARY KEY,
    productName varchar(100) not null,
    categoryId INT NOT NULL,
    CONSTRAINT fk_category
    FOREIGN KEY (categoryId) 
    REFERENCES categories(categoryId)
        ON UPDATE CASCADE
        ON DELETE CASCADE
) ENGINE=INNODB;

MySQL 관리를 위한 훌륭한 도구인 phpmyadmin을 사용하여 인덱싱 포함

언급URL : https://stackoverflow.com/questions/3002605/how-do-i-add-indexes-to-mysql-tables

반응형