2012-06-03 3 views
1

MySQL 데이터베이스에 가장 최근의 30 개의 메시지 만 저장하려는 턴 기반 게임 (PHP 및 MySQL 사용)을위한 채팅을 구축 중입니다. (chatMessages INTOMySQL 최적화 - 특정 수에 대한 삭제

INSERT : 새 행으로 새로운 채팅 메시지를 삽입

  1. : 카운트가 30을 초과하면

    현재, 내가 3 개 쿼리를하고 있어요 것은 가장 오래된 메시지를 삭제하기 $ params [ "message"]. " ', NOW (사용자 아이디, matchId, 메시지, 타임 스탬프) VALUES (". $ params [ "userId"]. ", $ params ["matchId "].))

  • 다시 데이터베이스의 메시지가 너무 많아서 가장 오래된 메시지를 가져옵니다.

    SELECT COUNT (ID) AS 카운트, ID AS oldestId FROM chatMessages WHERE matchId = ". $ params ["matchId "]. ID가 = ". $ oldestId

  • 는이 작업을 수행 할 수있는 방법이 있나요 WHERE 아이디 ASC의 LIMIT BY ORDER 1

  • 이 chatMessages에서 삭제 가장 오래된 메시지를 삭제 2, 심지어는 1 개의 단일 쿼리? 서버에서 많은 트래픽이 발생하므로 성능이 중요합니다.

  • +0

    무엇이 일치합니까? – Sebas

    답변

    0

    두 번째 및 세 번째 쿼리를 하나에내어 쓰기 :

    delete from chatMessages 
    where id not in (select id from chatMessages 
           order by id desc 
           limit 30) 
    

    삽입 트리거에 삽입 할 수 있습니다. 그렇게하면 가장 오래된 레코드가 삽입 후에 자동으로 삭제됩니다.

    +0

    그래도 성능이 향상됩니까? 3 개의 검색어는 내가 틀렸다고해도 여전히 만들어 져야합니다. –

    +0

    위 쿼리는 하나의 쿼리에서 너무 오래된 모든 ** 레코드를 삭제합니다. 사용한 두 개의 쿼리는 하나의 레코드 만 삭제합니다. 그리고 2 개의 별도의 쿼리 대신 하나의 쿼리 (아마도 서브 쿼리로)를 실행하는 것이 더 빠릅니다. –

    +3

    항상 레코드를 삭제하지 않으면 빠를 것입니다. 때때로 삭제해야하는 경우 예약 된 트리거를 사용할 수 있습니다. 가장 최근의 항목 30 개를 얻기 위해 선택 쿼리를 변경하지 않으시겠습니까? 테이블은 수천 또는 수백만 개의 레코드를 쉽게 저장할 수 있다는 것을 알고 있습니다. –