복붙노트

[SQL] 지수하지만 차없는 키와 MySQL의 테이블

SQL

지수하지만 차없는 키와 MySQL의 테이블

나는이 표에 나는 다른 평가 시스템을 식별 할 수있는 지수 (USER_ID, post_id를) 및 기타 열이 어떤 평가를 저장하는 테이블이 필요합니다.

user_id - bigint
post_id - bigint
type - varchar
...

Composite Index (user_id, post_id)

기본 필요가 고유하고 INDEX는 문제가되지 않습니다 내 경우 univocity에 고유해야하기 때문에이 표에서 내가 아닌 기본 키를했습니다.

예를 들어 내가 가질 수

INSERT INTO tbl_rate
    (user_id,post_id,type)
VALUES
    (24,1234,'like'),
    (24,1234,'love'),
    (24,1234,'other');

성능 문제가 발생할 수 있습니다 PRIMARY KEY의 실종? 내 테이블 구조가 좋다 또는 나는 그것을 변경해야?

감사합니다

해결법

  1. ==============================

    1.몇 가지 포인트 :

    몇 가지 포인트 :

    당신은 그냥 기본 키로 테이블과 결정에 대한 현재 고유 무엇을 사용하는 것 같은데. 그 작동합니다. 이 때문에 지역의 질의에 관해서 그리고 자연 키는 몇 가지 장점이있다. (각각의 사용자에 대한 데이터는 동일한 영역에 저장된다). 그리고 테이블은 당신이 차에 열을 기준으로 검색 할 경우 데이터에 조회를 제거하는 키를 클러스터 때문이다.

    여기 답변입니다

    나는 당신의 자신의 대리 키를 생성하고 기본 키로 사용하기보다는 당신이 업데이트 및 조회에 사용할 수 있습니다 때문에 이노의 내부 기본 키에 의존하는 것이다.

    ALTER TABLE tbl_rate 
    ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    ADD PRIMARY KEY(id);
    

    당신이 대리 기본 키를 생성 할 경우에, 나는 또한 당신의 키 UNIQUE를 만들 것입니다. 같은 비용하지만 정확성 적용합니다.

    ALTER TABLE tbl_rate 
    ADD UNIQUE ( user_id, post_id, type );
    
  2. ==============================

    2.예 이노에 확실히, 이노는 알고리즘을 사용하므로이 "ROWID"자신의 만드는, dict0boot.ic에 정의 된

    예 이노에 확실히, 이노는 알고리즘을 사용하므로이 "ROWID"자신의 만드는, dict0boot.ic에 정의 된

    Returns a new row id.
    @return the new id */
    UNIV_INLINE
    row_id_t
    dict_sys_get_new_row_id(void)
    /*=========================*/
    {
        row_id_t    id;
    
        mutex_enter(&(dict_sys->mutex)); 
    
        id = dict_sys->row_id;
    
        if (0 == (id % DICT_HDR_ROW_ID_WRITE_MARGIN)) {
    
            dict_hdr_flush_row_id();
        }
    
        dict_sys->row_id++;
    
        mutex_exit(&(dict_sys->mutex));
    
        return(id);
    }
    

    그 코드의 주요 문제 mutex_enter이다 ((dict_sys-> 뮤텍스)); 어느 thread가이 코드를 실행하는 경우 액세스하는 것을 차단하는 다른 스레드. 이 테이블 잠금의 MyISAM는 것 같은 것입니다 의미.

    실제로 예 릭 제임스이 위에서 언급 한 것과 비교 참으로 미미하다. 는 C / C ++ 컴파일러 것이 더 많은 CPU 명령 경량화하여 떨어져 더 많은 성능을 얻을 수있는 마이크로 최적화. 아직도 주요 성능 문제는 위에서 언급 ..

    또한, 나머지 연산자 (%)는 CPU 무거운 명령이다. DICT_HDR_ROW_ID_WRITE_MARGIN는 2의 거듭 제곱 인 경우 그러나 C / C ++ 컴파일러 (및 / 또는 구성 옵션)에 depening 경우 최적화 할 수 있습니다. 마찬가지로 (0 == (ID & (DICT_HDR_ROW_ID_WRITE_MARGIN - 1))) bitmasking 훨씬 빠르게 한, 나는 DICT_HDR_ROW_ID_WRITE_MARGIN 실제로 2의 거듭 제곱 숫자를했다 생각

  3. from https://stackoverflow.com/questions/57232919/mysql-table-with-composite-index-but-not-primary-key by cc-by-sa and MIT license

'SQL' 카테고리의 다른 글

[SQL] PHP에서 페이지 매김  (0) 2020.07.12
[SQL] 오라클 10g / 11g Mac 용 [마감]  (0) 2020.07.12
[SQL] 동적 SQL LOOP  (0) 2020.07.12
[SQL] 여러 값을 FIND_IN_SET  (0) 2020.07.12
[SQL] 오라클 DB 인용 열 이름  (0) 2020.07.12