programing

Laravel 소프트 삭제 가능한 MySQL/MariaDB 파티션(삭제된_at IS NULL 대 datetime 값)

itmemos 2023. 7. 31. 21:05
반응형

Laravel 소프트 삭제 가능한 MySQL/MariaDB 파티션(삭제된_at IS NULL 대 datetime 값)

Laravel Permunder 소프트 삭제 가능(소프트 삭제 가능이라고도 함) 테이블은 다음과 같습니다.

id | value1 | value2 | ... | valueN | deleted_at

그리고.deleted_at될 것이다null활성 항목의 경우 및 삭제된 항목의 경우 날짜/시간 값입니다.

InnoDB 테이블을 활성 레코드와 삭제 레코드로 분할할 수 있습니까?

(모든 null 값에 대한 파티션과 실제 값에 대한 다른 파티션을 의미합니다.

업데이트: 약간의 조사 끝에 다음과 같은 파티션을 만들었습니다.

ALTER TABLE `listings`
PARTITION BY RANGE( UNIX_TIMESTAMP(deleted_at) )
SUBPARTITION BY HASH( user_id )
SUBPARTITIONS 40
(
    PARTITION active VALUES LESS THAN (0), -- null values (not deleted rows) will go here
    PARTITION deleted VALUES LESS THAN MAXVALUE -- non-null values (deleted rows) will go here
);

업데이트 2: 사용자는 소프트 삭제되지 않습니다.목록은 그럴 것입니다.그들은 결국 활성 목록보다 삭제된 목록을 더 많이 축적할 것입니다.사용자는 임의의 열에 있는 필터의 숫자를 정의하고 결합할 수 있습니다(Excel 방식).user_id그리고.deleted_at < 0(이 경우 파티션을 잘라냅니다.IS NULL에 따르면, 하지 않을 것입니다.EXPLAIN PARTITIONS)는 항상 쿼리에 표시됩니다.파티션을 분할하면 항상 검사할 행 수가 줄어들고, 때로는 쿼리가 나머지 인덱스 중 하나를 사용하여 이점을 얻을 수 있다고 생각했습니다.제가 이것에 대해 옳았는지 확신할 수 없습니다.

PARTITIONing성능에 거의 도움이 되지 않습니다.

이것.

WHERE deleted_at IS NULL
  AND ...

복합 지수의 이점:

INDEX(deleted_at, ...)

"..." 부품이 어떤 식으로든 일치하는 곳.

(다음과 같은 이유로 작동합니다.IS NULL와 같이 작동합니다.=즉, 그러한 지수는 다음과 같이 말할 때 도움이 되지 않습니다.deleted_at IS NOT NULL그리고 그런 것들은 매우 유용하지 않을 것입니다.deleted_at BETWEEN ... AND ....)

가지 실제 질문을 보여주십시오. 공유할 추가 팁이 있을 수 있습니다.

파티션을 사용하지 않는 경우 인덱스:

PRIMARY KEY(user_id, id), -- perfect for finding one user
INDEX(id)   -- to keep auto_increment happy

한다면user_id독특합니다, 제거하는 것.id완전히.

삭제된 사용자를 모두 찾거나 검색해야 합니까?

언급URL : https://stackoverflow.com/questions/62350869/mysql-mariadb-partitioning-for-laravel-softdeleteable-deleted-at-is-null-vs-d

반응형