여태 아무 생각없이 INDEX를 걸고 있었는데...
갑자기 문득 궁금한게 생겨났어..
인덱스를 걸때..
INDEX `idx_refer` (`idx_refer`,`file_classify`,`mb_id`) 구문과...
INDEX (`idx_refer`),
INDEX (`file_classify`),
INDEX (`mb_id`)
구문에 혹시 차이점이 있는지..차이점이 있다면..그 차이점이 무엇인지..설명좀 해줄수 있는횽 있을까..?
첫번째 구문과 두번째 구문으로 생성해서 보면...
첫번째 구문은 idx_refer 라는 키 이름으로 괄호안에 있는 해당 컬럼들을 인덱스 거는것 같고..
두번째 구문은 각각의 개별 인덱스 키를 만드는거 같고..
그래서..이 두가지의 차이점이 뭔가 속도나 다른것에 차이점이 생겨나는지..알고 싶음..
참고로..첫번째 구문으로 인덱스 생성시,
Specified key was too long; max key length is 1000 bytes 라는 에러 구문을 내뱉음..
해결 방법은 구글링 해본결과
=============================================================================================
\"Prefixes can be up to 255 bytes long (or 1000 bytes for MyISAM and InnoDB tables as of
MySQL
4.1.2). Note that prefix limits are measured in bytes, whereas the prefix length in
CREATE INDEX
statements is interpreted as number of characters. Take this into account when specifying
a
prefix length for a column that uses a multi-byte character set.\"
You are correct, it is the utf8 that is causing the extra bytes. Try creating the table
this way:
CREATE TABLE phpgw_lang (
lang varchar(5) NOT NULL DEFAULT \'\',
app_name varchar(100) NOT NULL DEFAULT \'common\',
message_id varchar(255) NOT NULL DEFAULT \'\',
content text,
PRIMARY KEY(lang,app_name(75),message_id(100))
);
This will index the first 75 and 100 chars from the columns which should work
and be faster in general as well.
=============================================================================================
요게 답인데..UTF8 로 생성시 각 컬럼의 길이 *3 이 1000 바이트를 넘어서지 않게 적당히 조정하면 될거 같긴한데..
(사실 이것도 잘 이해되지 않는 부분이 그럼..255byte 길이의 컬럼을 100byte 로 인덱스를 걸면...255byte 의 데이터가 들어올경우 인덱스는 어케 되는거지?!)
여튼..첫번째 구문과 두번째 구문에 대해서 차이점을 설명해줄 횽 있으면 댓글점...>_<
여튼..첫번째 구문과 두번째 구문에 대해서 차이점을 설명해줄 횽 있으면 댓글점...>_<
캐닥이 내가아는 캐꼬닥이 맞나요?
아뇨. 캐꼬닥은 아니구여 캐꼬꼬닭 입니다.
다름 마니 다름
횽이 등장하길 은근 기대하고 있었츰
일단 친구한테 전화해서 재빠르게 물어본결과...\"복합인덱스\" 라는 키워드를 얻어냄
인덱스(도시,직업) 은 도시별로 1차 정렬 후 같은도시에서 직업별로 다시 2차 정렬 하는거임 인덱스(도시) 인덱스(직업) 은 도시별, 직업별 두가지를 가지고 있는거고
검색해보니, 복합인덱스 경우, 도시, 직업은 인덱스를 타고, 도시로 검색해도 인덱스가 타지만, 직업으로만 검색할경우에는 인덱스가 타지 않는다던데..
크기는 당연히 각각의 인덱스 보다는 복합인덱스가 크지만 두 인덱스의 합 보다는 약간 작음(이건 대충 그렇다고 넘어가라능) 그리고 당연히 서울에서 요리사 하는 사람을 찾으려면 복합 인덱스가 빠름 이건 이 인덱스 하나만 뒤지면 나오니까. 대신 어느 도시건 상관없이 기자 를 찾고 싶으면 위에 복합 인덱스는 안먹음 왜냐하면 도시별로 먼저 정렬이 되어있으니까.
캬~ 훗쇼형이 또 바로 대답을 주는구나...ㅋㅋ 차이점을 확실히 알게 되었음...감사합니당..꾸벅 꾸벅
횽 근데, 위에 에러를 내뱉었다고 했잖앙..그런데 해결 방안을 각 컬럼의 길이 인덱스를 1000 바이트로 미만으로 잡아주면 해결이 되는데...이때 255 바이트의 컬럼 길이의 값을 100 이라는 길이로 인덱스를 생성하면...나중에 255 바이트의 데이터가 들어올경우 인덱스는 155 바이트는 짤려버리는게 맞지?
ㅇㅇ 그러함
근데 이게 짤린다는게 인덱싱할때 짤린다는거지 실제 데이터가 짤리는건 아니라능!!
복합 인덱스와 관련해서는 covered index를 검색해보라능. 사실 인덱스가 커버가 되면 좋긴 한데 이건 어느정도 서로 트레이드오프가 되어야 하는 부분이라능
오케이! 궁금한점 모두 해결됬음 ! 횽 항상 DB 쪽으로 가려운 부분 생길때마다 바람처럼 나타나서 해결해줘서 고마워! 그리고 복합 인덱스라는 키워드를 던져준 친구한테도 감사 감사...
새로운 키워드 감사 !