2011-09-08 4 views
0

나는 웹 사이트에 나중에 게시해야하는 많은 콘텐츠가 있습니다. 시간이되면 가장 효과적인 방법은 무엇입니까?웹 사이트에서 콘텐츠를 예약하는 가장 효율적인 방법

현재 구현은 두 개의 datetime 열 online_atoffline_at입니다. online_atoffline_at 열을 통해 인덱스

SELECT * 
    FROM contents 
WHERE online_at > current_timestamp 
    AND (offline_at IS NULL OR 
     offline_at < current_timestamp); 

:

내용을 가져 오기 위해 SQL 쿼리는 다음과 같이 보인다. 그것은 잘 작동하고 분명한 성능 벌칙은 없지만, 이것에 대해 더 효율적인 방법이 있는지 궁금해하고 있습니다. 색인을 하나의 더 간단한 열로 축소하는 방법이 있습니까 (비싼 datetime이 아님)? 당신은 NULL로 기본적으로하지 않습니다 또한 내가 그 오프라인 보험에 가입 제안 타임 스탬프는 4 바이트 대 8

을 사용합니다 사용하는,하지만 당신은 MySQL을 사용하는 경우, 귀하의 열을 어떤 데이터베이스 언급하지 않았다

+0

online_at 및 offline_at 열 –

+0

은 질문에 명시된 바와 같이 datetime 열입니다. online_at에는 콘텐츠가 온라인으로 표시되어야하는 datetime이 포함되고 offline_at에는 콘텐츠가 다시 사라져야하는 datetime이 포함됩니다. offline_at은 NULL 일 수도 있는데,이 경우에는 내용이 사라지지 않습니다. –

+0

실행 계획은 어떻게 생겼습니까? –

답변

1

저는 여러 번 구조를 보았습니다. 수백만 행을 때릴 때 속도가 너무 느려지는 것을 보았 기 때문에 실제로 구조에 대해 걱정할 필요가 없습니다.

것은, 나 자신을 시도하지 않은,하지만 당신은 병렬 처리를 증가 줄 수 있음을, (당신의 DB에 따라 다름) online_atoffline_at 다음 EXCEPT/MINUS를 사용하여 별도의 인덱스를하는 것입니다. 본질적으로 ID 만 사용하면되지만 날짜는 제외하고 전체 필드 목록으로 확장 할 수 있습니다. 즉 :

SELECT id, header, text, ... 
    FROM CONTENT 
WHERE online_at < current_timestamp 
MINUS 
SELECT id, header, text, ... 
    FROM CONTENT 
WHERE offline_at < current_timestamp 
+1

사실 매우 똑똑한 쿼리입니다. 문제가 생겼을 때 시도 할 무언가처럼 보입니다. 지금은 잔인한 것처럼 보이고 원래 쿼리가 훌륭하다는 관찰을 기꺼이 받아들입니다. –

0

또는 NULL을 허용하십시오. 영원한 날짜를 사용하십시오 (나중에 날짜가 기본값 임). 테이블 정의를 변경하고이를 기본 날짜로 설정할 수 있습니다. 날짜가 '2037-12-31'인 시간 소인의 경우. datetime의 경우 '9999-12-31'입니다. 이제

이되지 않는 한하지 행당 8 바이트를 저장 아마 가능성이 어느 시점에서 대용량 데이터베이스,로 거래의 큰 것입니다,하지만 당신은 질문)

를이없는 경우 MySQL의 질문, 내게 알려주세요 나는이 대답을 제거합니다. 그럴 경우 다시 태그 할 수 있습니다. 이러한 열이 아닌만큼

또한 그러나 다시 당신이 그것을보고 요구 사항을 제거 할 online_at 사이

offline_at SELECT ... NOW() 로 쿼리를 다시 작성할 수있는 것은 NULL IS 색인.

+0

답변 해 주셔서 감사합니다. 실제로 다양한 시스템에서이 기술을 사용하고 있습니다 : MySQL, PostgreSQL 및 SQLite. 개인적으로 나는 실종 된 가치를 나타내는 9999-12-31과 같은 더미 날짜를 사용하는 팬이 아닙니다. 필자의 견해로는, 예제에서 offline_at과 같이, NULL 값은 무언가가 빠졌을 때 사용할 좋은 값입니다. –

+0

@Joost : 비논리적 인 당신의 권리를 존중합니다;) 시스템 offline_at IS NULL에서 가치가 없다는 것을 의미하지는 않습니다. 오프라인 상태의 행이 없으면 IS NULL이 결과 집합에 나타납니다. 실제로 "만료일 없음"이라는 글을 나타 내기 위해이 파일을 사용하고 있습니다. 당신이 물었 기 때문에 --- 이것은 효과적으로 offline_at에 대한 색인의 사용을 제거하고, 일을 더 느리게 만들며, 일반적으로 응용 프로그램의 이식성을 떨어 뜨립니다. 왜냐하면 NULL은 일반적으로 문제가 많고 피해야하기 때문입니다. OR을 추가하면 DB가 더 많은 작업을 수행해야한다는 표시가됩니다. – gview

+0

당신은 포인트가 있지만 데이터베이스 상단에있는 응용 프로그램에서 NULL을 쉽게 처리 할 수 ​​있습니다. 그래서 제 경우에는 너무 걱정하지 않습니다. 비록 내가 저장하고자하는 실제 값이 NULL이 아니지만 그것이 "영원한"것 또는 그와 비슷한 것이라는 점에 매우 동의하지만. 하지만 나는 그것이 SQL 스펙에 없다는 것을 확신한다. :) –

관련 문제