답변:
MySQL은 현재 조건부 인덱스를 지원하지 않습니다.
당신이 요구하는 것을 달성하기 위해 (당신이하지 않아야합니다;) 보조 테이블 만들기를 시작할 수 있습니다 :
CREATE TABLE `my_schema`.`auxiliary_table` (
`id` int unsigned NOT NULL,
`name` varchar(250), /* specify the same way as in your main table */
PRIMARY KEY (`id`),
KEY `name` (`name`)
);
그런 다음 기본 테이블에 세 개의 트리거를 추가하십시오.
delimiter //
CREATE TRIGGER example_insert AFTER INSERT ON main_table
FOR EACH ROW
BEGIN
IF NEW.status = 'ACTIVE' THEN
REPLACE auxiliary_table SET
auxiliary_table.id = NEW.id,
auxiliary_table.name = NEW.name;
END IF;
END;//
CREATE TRIGGER example_update AFTER UPDATE ON main_table
FOR EACH ROW
BEGIN
IF NEW.status = 'ACTIVE' THEN
REPLACE auxiliary_table SET
auxiliary_table.id = NEW.id,
auxiliary_table.name = NEW.name;
ELSE
DELETE FROM auxiliary_table WHERE auxiliary_table.id = OLD.id;
END IF;
END;//
CREATE TRIGGER example_delete AFTER DELETE ON main_table
FOR EACH ROW
BEGIN
DELETE FROM auxiliary_table WHERE auxiliary_table.id = OLD.id;
END;//
delimiter ;
트리거 내부에서
delimiter //
사용하고 싶기 때문에 필요;
합니다.
이렇게하면 보조 테이블에 트리거에 의해 업데이트되는 문자열 "ACTIVE"가 포함 된 기본 테이블 행에 해당하는 ID가 정확하게 포함됩니다.
에 그것을 select
사용하려면 평소를 사용할 수 있습니다 join
.
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
기본 테이블에 이미 데이터가 포함되어 있거나 비정상적인 방식으로 데이터를 변경하는 외부 작업을 수행하는 경우 (EG : 외부 MySQL) 다음과 같이 보조 테이블을 수정할 수 있습니다.
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
성능에 대해서는 삽입, 업데이트 및 삭제 속도가 느려질 수 있습니다. 원하는 조건이 긍정적 인 경우를 거의 다루지 않는 경우에만 의미가 있습니다. 그럼에도 불구하고, 아마도 테스트 한 것만으로도 절약 된 공간이 실제로이 aproach를 정당화하는지 (그리고 실제로 공간을 절약하고 있는지) 알 수 있습니다.
경우 내가 제대로 질문을 이해, 나는 당신이 뭘 하려는지 달성 할 것은 열 이름과 상태 모두에 인덱스를 생성하는 것입니다 생각합니다. 그러면 NAME = 'SMITH'및 STATUS = 'ACTIVE'위치를 효율적으로 쿼리 할 수 있습니다.
모든 데이터가 필요할 때 뷰를 사용하여 두 테이블을 통합하고 해당 열의 테이블 중 하나만 인덱싱하여 두 테이블로 데이터를 분할하면이 작업을 수행 할 수 있습니다. 그러나 이것이 필요한 쿼리의 성능 문제를 일으킬 것이라고 생각합니다 쿼리 플래너가 내가 인정한 것보다 더 영리하지 않으면 전체 테이블을 실행하십시오. 기본적으로 테이블을 수동으로 분할하고 인덱스를 하나의 파티션에만 적용합니다.
불행히도 내장 테이블 파티셔닝 기능 은 단일 파티션에 인덱스를 적용 할 수 없으므로 퀘스트에 도움이되지 않습니다.
인덱스가있는 추가 열을 유지 관리 할 수 있으며 인덱스의 기반이되는 조건이 true 일 때만 해당 열에 값을 가질 수 있지만 이는 노동 집약적이며 쿼리 효율성 및 공간 절약.
MySQL은 이제 인덱스에 사용할 수있는 가상 열을가집니다.
select count(*) from foo where id is null ;
인덱스를 사용할 수 있는가?)
decode(status,'ACTIVE',name,null)
.