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
로.strings
MySQL에 있습니다.한다면id
이int
따옴표를 삭제합니다.
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_index
MyISAM 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이 사용하지 않기로 결정한 경우 다음과 같은 이유로 인덱스를 사용할 수 있습니다.
- MySQL이 사용하기에 더 적합하다고 생각하는 쿼리에 다른 인덱스가 있으며 하나만 사용할 수 있습니다.일반적인 검색 방법이 여러 열의 값을 사용하는 경우 솔루션은 일반적으로 여러 열에 걸쳐 있는 인덱스입니다.
- MySQL은 일치하는 행이 너무 많다고 판단하고 테이블스캔이 더 빠를 수 있다고 생각합니다.않으면 렇렇 if if if an an if if if if if if, if if if
ANALYZE TABLE
selp.mailbanda. - 좀 더 복잡한 질문에서는 어떤 이유로 인해 현재 요구 사항에 맞지 않는 매우 인텔리전트한 생각의 부두(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
'programing' 카테고리의 다른 글
호출되지 않은 객체의 메서드를 확인하는 방법은 무엇입니까? (0) | 2022.11.27 |
---|---|
google chrome 확장자 :: console.log()를 백그라운드페이지에서 사용하시겠습니까? (0) | 2022.11.27 |
공백 공간을 언더스코어로 대체하려면 어떻게 해야 합니까? (0) | 2022.11.27 |
날짜로부터 월의 마지막 날을 어떻게 찾을 수 있습니까? (0) | 2022.11.27 |
sql.쿼리가 잘리거나 불완전한 결과 (0) | 2022.11.27 |