MySQL에서 함수 기반 인덱스를 가질 수 있습니까?
Oracle에서는 함수를 기반으로 색인화하는 것이 가능합니다 SUBSTRING(id,1,8)
.
MySQL이이를 지원합니까? 그렇지 않다면 대안이 있습니까?
아니요, 일반적인 의미는 아닙니다. 5.6 (이 답변이 처음 작성되었을 때 최신 버전)에도이 기능이 있다고 생각하지 않습니다. 8.0.13 이상은 이제 기능 색인을 지원하므로 아래에 설명 된 트리거 방법 없이도 필요한 것을 얻을 수 있습니다.
이에 대한 자세한 내용은 https://dev.mysql.com/doc/refman/8.0/en/create-index.html 을 참조 하십시오 .
당신의 이전 버전을 실행하는 경우 mysql
, 이다 에만 사용할 수 선도적 인 컬럼의 일부를 (이 기능은 주위에 오래되었습니다)하지만 두 번째 또는 후속 문자 또는 다른 더 복잡한 기능에서 시작하지 하나 .
예를 들어 다음은 이름의 처음 5자를 사용하여 색인을 만듭니다.
create index name_first_five on cust_table (name(5));
더 복잡한 식의 경우 인덱싱 가능한 데이터가 포함 된 다른 열이있는 다음 삽입 / 업데이트 트리거를 사용하여 올바르게 채워지 는 방식으로 유사한 효과를 얻을 수 있습니다 .
중복 데이터를 위해 낭비되는 공간을 제외하고는 거의 동일합니다.
기술적으로는 3NF를 위반하지만 트리거를 사용하여 데이터를 동기화 상태로 유지함으로써 완화됩니다 (성능 향상을 위해 자주 수행되는 작업입니다).
MySQL은이를 지원하지 않지만 대안이 있습니다.
1. MySQL 5.7.6 이후
자동 생성 된 열을 사용하여 색인이있는 하위 문자열을 보유 할 수 있습니다.
CREATE TABLE SomeTable (
id CHAR(10),
sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id)
)
으로 벤자민 언급 저장된 키워드가 ommitted 할 수 있도록, InnoDB는 가상 컬럼에 보조 인덱스를 지원합니다. 실제로 가상 열의 보조 인덱스가 더 바람직 할 수 있습니다. 자세한 정보 : 보조 인덱스 및 생성 된 열
2. MySQL 5.7.6 이전
인덱스가있는 트리거에 의해 업데이트 된 열을 사용할 수 있습니다.
CREATE TABLE SomeTable (
id CHAR(10),
sub_id CHAR(8) , INDEX(sub_id)
);
CREATE TRIGGER TR_SomeTable_INSERT_sub_id
BEFORE INSERT
ON SomeTable FOR EACH ROW
SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8);
CREATE TRIGGER TR_SomeTable_UPDATE_sub_id
BEFORE UPDATE
ON SomeTable FOR EACH ROW
SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8);
이것은 새로운 생성 된 열을 사용하는 MySQL 5.7.5부터 가능합니다 .
예, MySQL에서 기능 색인을 만들 수 있습니다. 이 기능은 MySQL 8.0.13에서 사용할 수 있습니다. (다른 RDBMS는 이전 릴리스에이 기능이 있지만 MySQL은 릴리스 8.0.13에서이 기능을 도입했습니다.) 기능 색인
여기에 MySQL8.0에서 기능 인덱스를 생성하는 예제가 있습니다.
이것은 쿼리입니다
선택 * from app_user where month (createdOn) = 5;
mysql> select * from app_user where month (createdOn) = 5; 7e9e2b7bc2e9bde15504f6c5658458ab-74322 행 세트 (5.01 초)
createdOn 열에 인덱스가 있더라도 74322 레코드를 가져 오기 위해 5 초 이상 실행됩니다. (createdOn 열에 대한 인덱싱은 month () 함수에 의해 마스킹되므로 옵티 마이저에서 사용되지 않습니다.
이제 아래 구문을 사용하여 열에 기능 색인을 만들었습니다.
mysql>alter table app_user add index idx_month_createdon((month(createdOn))); Query OK, 0 rows affected (1 min 17.37 sec) Records: 0 Duplicates: 0 Warnings: 0
mysql>select * from app_user where month(createdOn)=5; 7e9e2b7bc2e9bde15504f6c5658458ab - 74322 rows in set (0.29 sec)
After creating the functional index, it is executing in 0.29 secs.
It is difficult to find functional index document in Mysql website, it is in the name of functional key parts
And We cannot drop the column which is having functional index. To achieve, we need to drop the functional index in the first place.
mysql> alter table app_user drop column createdOn; Cannot drop column 'createdOn' because it is used by a functional index. In order to drop the column, you must remove the functional index.
MySQL> 5.7.5를 사용 하는 경우 생성 된 열을 사용하여 동일한 결과를 얻을 수 있습니다 .
참조 URL : https://stackoverflow.com/questions/10595037/is-it-possible-to-have-function-based-index-in-mysql
'IT Share you' 카테고리의 다른 글
/ dev / tty의 특별한 점은 무엇입니까? (0) | 2021.01.07 |
---|---|
Android에서 res / values / public.xml 파일의 용도는 무엇입니까? (0) | 2021.01.07 |
jQuery 클릭 이벤트에서 false 반환 (0) | 2021.01.07 |
angularjs-ng-src 내에서 {{}} 바인딩을 사용하지만 ng-src가로드되지 않음 (0) | 2021.01.07 |
루프 변수가없는 C ++ 11 범위 기반 for 루프 (0) | 2021.01.07 |