나는 테이블을 만드는 과정에 있는데 그것은 나를 놀라게했다.
제조사 (fx BMW, Audi 등)가있는 자동차를 저장하면 make를 int 또는 varchar로 저장하면 쿼리 속도에 차이가 생길 수 있습니다.
그래서
SELECT * FROM table WHERE make = 5 AND ...;
보다 빠름 / 느림
SELECT * FROM table WHERE make = 'audi' AND ...;
아니면 속도가 어느 정도 같을까요?
답변
int가 varchar보다 훨씬 적은 공간을 차지한다는 단순한 사실 때문에 Int 비교는 varchar 비교보다 빠릅니다.
이는 인덱싱되지 않은 액세스와 인덱싱 된 액세스 모두에 적용됩니다. 가장 빠른 방법은 인덱싱 된 int 열입니다.
postgreql 질문에 태그를 지정했듯이 다양한 날짜 유형의 공간 사용량에 관심이있을 수 있습니다.
int
필드는 2 ~ 8 바이트를 차지 하며 4는 일반적으로 충분합니다 (-2147483648 ~ +2147483647).- 문자 유형 은 실제 문자열과 함께 4 바이트를 차지 합니다.
답변
몇 가지 대략적인 벤치 마크 :
Postgres 9.x의 4 백만 레코드
Table A = base table with some columns
Table B = Table A + extra column id of type bigint with random numbers
Table C = Table A + extra column id of type text with random 16-char ASCII strings
8GB RAM, i7, SSD 노트북의 결과 :
Size on disk: A=261MB B=292MB C=322MB
Non-indexed by id: select count(*), select by id: 450ms same on all tables
Insert* one row per TX: B=9ms/record C=9ms/record
Bulk insert* in single TX: B=140usec/record C=180usec/record
Indexed by id, select by id: B=about 200us C=about 200us
* inserts to the table already containing 4M records
따라서 인덱스가 RAM에 맞는 한, bigint 대 16-char 텍스트는 속도에 차이가 없습니다.
답변
varchar 대신 int를 사용하면 조금 더 빠를 것입니다. 속도를 위해 더 중요한 것은 쿼리가 레코드를 찾는 데 사용할 수있는 필드에 대한 인덱스를 갖는 것입니다.
int를 사용하는 또 다른 이유는 데이터베이스를 정규화하는 것입니다. ‘Mercedes-Benz’라는 텍스트를 테이블에 수천 번 저장하는 대신 ID를 저장하고 브랜드 이름을 별도의 테이블에 한 번 저장해야합니다.
답변
문자열 비교와 non-floats의 실제 성능으로 분류하면이 경우 부호없는 크기와 부호있는 크기는 중요하지 않습니다. 크기는 실제로 성능의 진정한 차이입니다. 1 바이트 + (최대 126 바이트) 대 1,2,4 또는 8 바이트 비교 … 분명히 non-float는 문자열 및 부동 소수점보다 작기 때문에 어셈블리에서 CPU 친화적입니다.
모두 에서 문자열 대 문자열 비교 언어의 는 CPU에 의해 하나의 명령어로 비교할 수있는 것보다 느립니다. 32 비트 CPU에서 8 바이트 (64 비트)를 비교해도 VARCHAR (2) 이상보다 빠릅니다. * 다시, 생산 된 어셈블리를 보면 (손으로도) 1-8 바이트 CPU 숫자보다 char별로 char을 비교하는 데 더 많은 명령이 필요합니다.
이제 얼마나 빨라 졌습니까? 데이터의 양에 따라 달라집니다. 5를 단순히 ‘audi’와 비교하는 경우-이것이 DB에있는 모든 것이므로 그 결과 차이가 너무 작아서 결코 볼 수 없습니다. CPU, 구현 (클라이언트 / 서버, 웹 / 스크립트 등)에 따라 DB 서버에서 수백 번 비교 (눈에 띄기 전에 수천 번 비교) 할 때까지 볼 수 없을 것입니다.
- 해시 비교에 대한 잘못된 분쟁을 무효화합니다. 대부분의 해싱 알고리즘 자체는 느리기 때문에 CRC64 이하와 같은 것의 이점을 얻지 못합니다. 12 년 넘게 여러 국가의 검색 엔진을위한 검색 알고리즘을 개발했고 신용 조사 기관을위한 7 년을 개발했습니다. 전화 번호, 우편 번호, 심지어 통화 * 1000 (저장) 통화 div 1000 (검색)은 비교를 위해 DECIMAL보다 빠릅니다.
오즈
답변
인덱스 여부에 관계없이 int는 훨씬 빠릅니다 (varchar가 길수록 느려집니다).
또 다른 이유 : varchar 필드의 인덱스가 int보다 훨씬 큽니다. 더 큰 테이블의 경우 수백 메가 바이트 (및 수천 페이지)를 의미 할 수 있습니다. 인덱스 읽기만으로는 많은 디스크 읽기가 필요하므로 성능이 훨씬 나빠집니다.
답변
일반적으로 int는 더 빠릅니다. varchar가 길수록 느려집니다.
답변
힌트 : 필드에 사용할 수있는 값 경우 make가 됩니다 결코 (또는 거의) 변화, 당신은 타협으로 ENUM을 사용할 수 있습니다. 그것은 좋은 속도와 좋은 가독성을 결합합니다.