**** EDIT ****Как я могу оптимизировать запрос 'IN'?
14ms может показаться не очень много, однако, как вы можете видеть ниже в «PostgresSQL Explain», PostgreSQL выполняет Seq Scan на 80 000 строк. Должен быть способ избежать этого сканирования и сделать несколько запросов индекса.
**** EDIT END ****
Я играл с идеей schemaless и я следующие три таблицы:
Таблицы заполняются 100000 случайных записей.
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)
с неоднозначным индексом index_username_email(key)
Моего SQL запрос:
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, поэтому это должно быть то, что я делаю неправильно.
Любая идея, как я могу ее оптимизировать или что я делаю неправильно?
Спасибо!
Postgres объяснить:
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 * миллисекунды * не "колоссальную". –
Когда это должно быть меньше 1 мс, это: D –
Ничто не меньше, чем 8 мс – Drew