Я написал код для тестирования mongodb. Но скорость у него такая плохая. Что не так?
func mgoSpeedTest(N int) int64 {
session, err := mgo.Dial(MongoHost)
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
start := time.Now()
for i := 0; i < N; i++ {
sessionCopy := session.Copy()
c := session.DB(MongoDB).C(MongoCol)
_, err = c.Find(bson.M{"id": 1}).Count()
if err != nil {
log.Fatal(err)
}
sessionCopy.Close()
}
t := time.Now()
elapsed := t.Sub(start)
return elapsed.Milliseconds()
}
func main() {
// speed test
N := 1000
ms = mgoSpeedTest(N)
println(fmt.Sprintf("mgo: %d", ms))
}
Ответ ~~ 3500мс Пробовал использовать mongo-client, но скорость та же ~ 3700-3800
Вы выполняете 1 тысячу запросов, в среднем 3,5 мс (включая передачу по сети туда и обратно, выполнение базы данных, обработку результатов, копирование и закрытие сеанса). Что считается хорошим? Учитывая то, что происходит под капотом, я не думаю, что это плохо. Используйте тот же сеанс, если хотите повысить производительность. — person Егор Козельский schedule 16.10.2019
Я также пробовал вставить 1000 документов в базу данных localhost. 1000 вставок = 36 секунд. Но в официальных скоростных характеристиках разница в скорости — person Егор Козельский schedule 16.10.2019
Я бы также выполнил вызов mgo.Dial()
перед запуском таймера, чтобы убедиться, что ваш сеанс готов. — person Егор Козельский schedule 16.10.2019
И вы исключаете возможность того, что это ваш код плохо себя ведет? Я бы не стал. Раскройте код, и мы сможем выяснить, в чем проблема. Подсказка: если бы это было обычным явлением, никто бы не использовал драйвер mongo. Даже MongoDB Inc. И все их инструменты (mongodump
и т. Д.) Написаны на Go. — person Егор Козельский schedule 16.10.2019
Кроме того, вы смотрите вверх id
(не _id
, заметьте). Это в основном означает, что выполняется сканирование коллекции. Суть: MongoDB необходимо открывать каждый документ, читать его, сравнивать значение поля id
с 1. Кстати, ваш код даже не компилируется — у меня такое ощущение, что вы скрываете информацию случайно или намеренно. Если код отсутствует, это не позволяет нам помочь вам должным образом. — person Егор Козельский schedule 18.10.2019
Мне было любопытно, и я составил собственный небольшой тест. Он использует один экземпляр MongoDB через докер:
Согласно эталону, это двоякое: простая вставка и объемная вставка. Массовые вставки — это предпочтительный способ борьбы с массовыми вставками.
Он проверяет как драйвер mgo, так и драйвер mongo-go:
Мы видим, что оба драйвера на порядки быстрее, чем вы описываете, поэтому можно с уверенностью предположить, что это не драйвер, вызывающий задержки.
где вы определяете данные {}? — person Егор Козельский; 21.01.2020
@ScottStensland Честно говоря, я этого не делал, так как думал, что это будет слишком очевидно. Добавлю это. — person Егор Козельский; 21.01.2020