мои «чистые» решения Swift без соответствия Post для Hashable (требуется Set)
struct Post {
var id: Int
}
let posts = [Post(id: 1),Post(id: 2),Post(id: 1),Post(id: 3),Post(id: 4),Post(id: 2)]
// (1)
var res:[Post] = []
posts.forEach { (p) -> () in
if !res.contains ({ $0.id == p.id }) {
res.append(p)
}
}
print(res) // [Post(id: 1), Post(id: 2), Post(id: 3), Post(id: 4)]
// (2)
let res2 = posts.reduce([]) { (var r, p) -> [Post] in
if !r.contains ({ $0.id == p.id }) {
r.append(p)
}
return r
}
print(res2) // [Post(id: 1), Post(id: 2), Post(id: 3), Post(id: 4)]
Я предпочитаю (1) инкапсулировать в функцию (aka func unique(posts:[Post])->[Post]
), возможно, расширение Array .. ..
Есть ли у вас индексы для этой таблицы? Вы сказали, что возвращается около 300. Но сколько нужно перерыть, чтобы найти эти 300?
План объяснения обычно является лучшим местом для начала, когда у вас медленный запрос. Чтобы получить его, запустите
DESCRIBE SELECT source_id FROM directions WHERE (destination_id = 10);
. Это покажет вам таблицу, в которой перечислены шаги, необходимые для выполнения вашего запроса. Если вы видите большое значение в столбце «строки» и NULL в столбце «ключ», это означает, что вашему запросу необходимо сканировать большое количество строк, чтобы определить, какие из них вернуть.
В этом случае добавление index on destination_id должен значительно ускорить ваш запрос за счет некоторой скорости вставки и удаления (поскольку индекс также необходимо будет обновить).