Hello Maks,
As I think Sam suspects the issue might be that you may not have enough RAM, or not enough RAM is allocated to shared_buffers, or you may have this table's data being evicted from shared_buffers because of some other queries, so while you are identifying all the rows in your fast index scan retrieving the records from disk is very slow. You might want to investigate your shared buffers like so:
Buffer hit rate for the table:
SELECT heap_blks_hit/(heap_blks_hit+heap_blks_read) AS buffer_hit_ratio
FROM pg_statio_user_tables
WHERE relname='users';
Buffer hit rate for the db:
SELECT heap_blks_hit/(heap_blks_hit+heap_blks_read) AS buffer_hit_ratio
FROM pg_statio_user_tables;
Get the current shared buffers setting:
SELECT current_setting('shared_buffers');
If you are going to use 'EXPLAIN (ANALYZE 1,BUFFERS 1)' as Sam suggested it might be good to use some different commonly accessed profile_ids than the ones you just used because those ones will be more likely to be in buffers than usual (since you just ran the same query via explain analyze)