상태 컬럼이있는 MySQL InnoDB 테이블이 있습니다. 상태는 '완료'또는 '처리 중'일 수 있습니다. 테이블이 커짐에 따라 상태 값의 .1 %는 '처리 중'이고 나머지 99.9 %는 '완료'됩니다. 이것은 '처리'에 대한 높은 선택성으로 인해 색인에 대한 훌륭한 후보자처럼 보입니다 ('완료'는 아님). 'processing'값만 인덱싱하는 상태 열에 대한 인덱스를 만들 수 있습니까? 나는 인덱스가 엄청난 양의 공간 인덱싱을 낭비하는 것을 원하지 않는다.하나의 MySQL 컬럼 값 인덱싱
답변
내가 어떤 표준 방법을 알고 아니에요 이렇게하려면 두 테이블을 사용하여 비슷한 문제를 해결해야합니다. Processing
및 Done
, 이전에는 색인이 있고 후자는없는 것입니다. 행 이제까지 processing
에 done
에서 다시 전환하지 않는 것이 가정
, 여기 당신이 사용할 수있는 단계는 다음과 같습니다 당신이 레코드를 생성 할 때
- 이
processing
로 설정 컬럼으로Processing
테이블에 삽입합니다. - 완료되면 열을
done
으로 설정합니다. Processing
테이블을 주기적으로 스윕하고done
행을Done
테이블로 이동합니다.
마지막 항목은 까다 롭습니다. 트랜잭션에서 삽입/삭제를 수행하여 트랜잭션이 올바르게 전송되도록하거나 고유 한 ID를 사용하여 이미 전송되었는지 감지 한 다음 Processing
에서 삭제할 수 있습니다 (MySQL 트랜잭션 지원에 대한 경험이 없기 때문에 또한 옵션을 제공함).
그런 식으로 done
행의 99.9 % 중 일부만 색인을 생성합니다. 아직 행이 Done
표로 전송되지 않았습니다. 덧글에서 언급 한 바와 같이 processing
의 여러 상태에서도 작동합니다 (항목은 done
상태에 도달했을 때만 전송되고 다른 모든 상태는 Processing
테이블에 유지됩니다).
효율성을 위해 별도의 테이블로 이전 한 기록 데이터 (다시 변경되지 않는 데이터)가있는 것과 비슷합니다. 두 테이블을 조인해야하기 때문에 done
및 비 done
행에 모두 액세스해야하는 일부 쿼리가 복잡해 지므로 절충안을 알아 두십시오.
더 나은 해결책 : 상태를 나타내는 문자열을 사용하지 마십시오. 대신 설명적인 이름 => 정수 값을 사용하여 코드에서 상수를 사용하십시오. 그런 다음 정수는 데이터베이스에 저장되고 MySQL은 문자열보다 빠르게 작동합니다.
난 당신이 사용하는 어떤 언어 모르겠지만 PHP 예를 들면 :
대신 당신이 지금 무슨의class Member
{
const STATUS_ACTIVE = 1;
const STATUS_BANNED = 2;
}
if ($member->getStatus() == Member::STATUS_ACTIVE)
{
}
:
if ($member->getStatus() == 'active')
{
}
답변 해 주셔서 감사합니다.문자열은 사실 ENUM이며, 이는 정수로 매핑된다는 것을 의미합니다. 당신의 제안은 유효한 질문이지만, 그것은 나의 질문의 근원에 도달하지 못합니다 : 그것은 꼭 필요한가? – BrainCore
- 1. MySQL MyISAM이 텍스트 컬럼 인덱싱
- 2. MySQL 컬럼
- 3. mysql 테이블의 동적 컬럼?
- 4. InnoDB를위한 인덱싱 된 MySQL 인덱싱/검색 대체?
- 5. 멀티 컬럼 이름 검색 MySQL
- 6. mysql 데이터베이스에서 조인 인덱싱
- 7. MySQL 데이터베이스의 컬럼 이름에 하이픈이있는
- 8. MySQL 컬럼 이름 표준/협약
- 9. MySQL DB를위한 최상의 인덱싱 전략
- 10. MySql TEXT 열을 인덱싱 하시겠습니까?
- 11. 하나의 MySQL 테이블에서 다른 테이블로 어떻게 INSERT하고 하나의 컬럼 값을 설정합니까?
- 12. join을 사용하여 하나의 테이블에서 다른 테이블로 mysql 컬럼 데이터 복사? 이 하나의 구문을 알아내는 데 문제가
- 13. 인덱싱 된 데이터베이스에 빈 값 삽입 문제
- 14. mysql 테이블 2 고유 한 컬럼
- 15. 매우 긴 데이터를위한 mysql 유형 컬럼?
- 16. MySQL 성능 : 인덱싱 된 열에 주어진 값이 있는지 쿼리
- 17. MySQL 전체 텍스트 인덱싱 제한 사항?
- 18. 인덱싱
- 19. MySQL 테이블에서 값 빼기
- 20. 테이블에서 NOT NULL 컬럼 선택
- 21. Django에서 데이터베이스 컬럼 반복하기
- 22. MySQL - 기존 값 늘리기
- 23. 데이터베이스에 파일 이름 인덱싱
- 24. MySQL Left Outer Join, MAX() 및 기타 컬럼
- 25. MySQL - 하나의 쿼리로 가능합니까?
- 26. 표준 컬럼 군 대 수퍼 컬럼 군
- 27. Ultrarawingrid 컬럼 선택기 및 컬럼 필터
- 28. 멤버가없는 컬럼
- 29. PK 값 업데이트하기 mysql
- 30. MySQL 값 삭제
값이 "1"또는 "0"인 "처리"라는 비트 열로 변환하는 것이 더 쉬운 지 궁금합니다. 공간을 적게 차지합니다. (2 개 이상의 상태가없는 한) –
좋습니다. 실제로 2 가지 이상의 상태가 있지만 단순화를 위해 단순화했습니다. – BrainCore
"단순화를 위해 단순화했습니다."- 다른 이유로 몇 가지를 단순화하지 않는 한 괜찮습니다 .- – paxdiablo