2010-12-22 6 views
1

나는 관리 인터페이스에서만 사용되는 인덱스 필드 users.username이 있습니다. 테이블에 현재 많은 쓰기가 있으므로 해당 인덱스를 제거하고 싶습니다. 물론 관리자를 위해 색인을 검색 할 수 있도록하고 싶습니다.선택적으로 db 인덱스를 줄이는 전략

전체 열을 추출하여 해당 인덱스를 다른 테이블로 이동할 수있었습니다. 그러나 무거운 필기구를 다른 테이블 (단 하나의 인덱스 만)로 옮길 계획이기 때문에 어리 석다.

검색 엔진에서의 던지기는 과도합니다.

간단한 솔루션에 대한 아이디어가 있습니까?

[편집] 관리자가 많은 필드를 검색하고 정렬해야하는 필요성이 실제로는 훨씬 많은 색인이 필요한 많은 테이블에 영향을 미친다는 것을 알게되었습니다. 첫 번째 단계에서는 관리자가 라이브 서버의 느린 정렬/검색을 막기 위해 전용 서버 + db를 확보하도록하고 장기적으로는 검색 엔진이 적합한 지 조사 할 것입니다. 모두에게 감사드립니다!

+0

"관리자를 검색 할 수 있음"은 "관리자가 검색 할 수 있음"또는 "관리자 상태의 사용자 이름을 찾을 수 있음"을 의미합니까? – Quassnoi

+1

이 색인을 제거하면 쓰기 성능이 현저히 향상되는지 확인 했습니까? – Mchl

+0

@quassnoi 검색 가능 관리자 BY @michi 좋은 충고. 방금 테이블을 고정 너비로 ​​바꿨습니다. 먼저 프로필을 작성한 다음 인덱스를 제거해야합니다. – eldergawd

답변

2

특정 사용자 만 액세스 할 수있는 색인을 유지 관리하는 것은 MySQL에서 지원되지 않으며, 그렇다고하더라도 일반적인 색인을 유지하는 것보다 비용이 많이 듭니다. ,

CREATE TABLE shadow_username (username VARCHAR(100) NOT NULL PRIMARY KEY, userid INT NOT NULL, UNIQUE (userid)) 

적시에 기입 : 사용자 이름은 고유 가정

, 그와 같은 별도의 인덱스와 같은 테이블을 만들 수 있습니다

TRUNCATE 
     shadow_username 

INSERT 
INTO shadow_username 
SELECT username, id 
FROM users 

을하고 쿼리 :

SELECT u.* 
FROM (
     SELECT id 
     FROM shadow_username 
     WHERE username = 'user' 
     ) s 
JOIN users u 
ON  u.id = s.id 
UNION ALL 
SELECT u.* 
FROM users 
WHERE id > 
     (
     SELECT MAX(id) 
     FROM shadow_username 
     ) 
     AND username = 'user' 
UNION ALL 
SELECT * 
FROM users 
WHERE username = 'user' 
LIMIT 1 

첫 번째 부분은 일반적인 검색입니다. 두 번째 부분은 업데이트 사이에 삽입 된 사용자 이름을 처리하여 shadow_username; 세 번째 부분은 이전 두 단계에서 아무 것도 발견되지 않은 경우에만 일반 검색을 수행하는 대체 방법입니다 (사용자가 사용자 이름을 변경하면 발생할 수 있음).

사용자 이름이 변경되지 않으면 세 번째 단계를 생략해야합니다.

0

실제 문제가 어디 있는지 모르겠습니다. "사용자 이름"필드에 쓰여지는 경우 색인을 업데이트해야하며 색인을 생성할지 여부는 읽기 성능과 쓰기 성능간에 균형이 맞는지 여부에 관계없이 기록됩니다. 대부분의 사용자가 자신의 이름을 거의 변경하지 않는 경우가 많으므로 RDBMS에서 색인을 전혀 건드리지 않아야합니다.

내 수정 구슬을 보면 "users"테이블의 "heavy write"필드가 로그인 세션이고 다른 테이블에 있어야한다고 가정합니다.

+0

슬프게도 우리 애플 리케이션은 항상 모든 필드 (나사 orm)를 작성하는 업데이 트의 상단에 사용자 이름을 변경할 수 있습니다. mysql은 실제로 변경되지 않는 인덱스를 변경하지 않습니까? – eldergawd

+1

@eldergawd : 기본 칼럼이 업데이트에서 변경되지 않으면, 'MySQL'은 인덱스를 건드리지 않을 것입니다. 삽입 또는 삭제가 발생하면 색인은 항상 기록되며 삽입시 페이지 분할이 발생할 수 있습니다. – Quassnoi

+0

같은 테이블에있는 "현금"필드와 달리 인덱스가 문제가되지 않습니다. 너무 많은 일을 ... ~ : S – eldergawd

1

정확하게 이해한다면 $ ways_to_access_data의 특정 하위 집합 (예 : 관리 인터페이스와 공개 인터페이스)에 대한 색인을 만들 수 없습니다.

열이 인덱싱되거나 그렇지 않습니다.