**** 편집 ****'IN'쿼리를 어떻게 최적화 할 수 있습니까?
14ms는 "PostgresSQL Explain"에서 아래에서 볼 수 있듯이 많이 보이지 않을 수 있습니다. PostgreSQL은 80,000 행의 연속 스캔을 수행합니다. 이 검사를 피하고 대신 색인 조회를 수행하는 방법이 있어야합니다.
**** 편집 END ****
내가 스키마의 아이디어로 주위를 연주하고 있는데이 세 개의 테이블 다음 한 : 테이블은 10 만 개 무작위 항목으로 채워집니다
합니다. index_username_email(key)
내 SQL 쿼리에 고유하지 않은 인덱스
entities(_primary_key SERIAL PRIMARY KEY, _id CHAR(32) UNIQUE,
data BYTEA)
index_username_profile_names(_id CHARE(32) PRIMARY KEY,
key VARCHAR UNIQUE)
index_username_email(_id CHAR(32) PRIMARY KEY, key VARCHAR)
는 '테스트'하지 종료는하지만
이SELECT data FROM entities WHERE
_id IN (SELECT _id FROM index_users_email WHERE key = 'test')
OR
_id in (SELECT _id FROM index_users_profile_name WHERE key = 'test')
이것은 '인덱스 중 하나를 후후 14ms 소요 '테이블, 내가 PostgreSQL이나 MySQL을 사용하든 상관없이, 내가 잘못하고있는 것이 틀림 없다.
내가 어떻게 최적화 할 수 있는지 또는 내가 잘못하고있는 것을 아는가?
감사합니다.
포스트 그레스 설명 : 하나의 잠재적 인 대답은 union
및 join
처럼
Seq Scan on entities (cost=16.88..4776.15 rows=80414 width=163) (actual time=15.169..15.169 rows=0 loops=1)
Filter: ((hashed SubPlan 1) OR (hashed SubPlan 2))
Rows Removed by Filter: 107218
SubPlan 1
-> Index Scan using index_users_email_key_idx1 on index_users_email (cost=0.42..8.44 rows=1 width=33) (actual time=0.039..0.039 rows=0 loops=1)
Index Cond: ((key)::text = 'test'::text)
SubPlan 2
-> Index Scan using index_users_profile_name_key_idx1 on index_users_profile_name (cost=0.42..8.44 rows=1 width=33) (actual time=0.071..0.071 rows=0 loops=1)
Index Cond: ((key)::text = 'test'::text)
Planning time: 0.202 ms
Execution time: 15.216 ms
14 * 밀리 초 * "무려"아니다. –
1ms보다 작을 때는 다음과 같습니다. D –
아무 것도 작지 않습니다. 8ms – Drew