From 06a64cdd2caeda65d4367e3ea7c8ae92f186ac9f Mon Sep 17 00:00:00 2001 From: Tomas Touceda Date: Thu, 23 Dec 2021 15:45:50 -0300 Subject: [PATCH] Use id instead of seen time/created_at to sort hosts (#3482) * Use id instead of seen time/created_at to sort hosts * Add test for ordering by id --- changes/use-index-for-sorting-hosts | 1 + server/datastore/mysql/hosts.go | 2 +- server/datastore/mysql/hosts_test.go | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 changes/use-index-for-sorting-hosts diff --git a/changes/use-index-for-sorting-hosts b/changes/use-index-for-sorting-hosts new file mode 100644 index 0000000000..8b5c8cf0dc --- /dev/null +++ b/changes/use-index-for-sorting-hosts @@ -0,0 +1 @@ +* Improve performance of sorting hosts in certain scenarios. diff --git a/server/datastore/mysql/hosts.go b/server/datastore/mysql/hosts.go index b293efdc0c..1f2077bc01 100644 --- a/server/datastore/mysql/hosts.go +++ b/server/datastore/mysql/hosts.go @@ -816,7 +816,7 @@ func (d *Datastore) SearchHosts(ctx context.Context, filter fleet.TeamFilter, qu args = append(args, in) sqlb.WriteString(" id NOT IN (?) AND ") sqlb.WriteString(d.whereFilterHostsByTeams(filter, "h")) - sqlb.WriteString(` ORDER BY COALESCE(hst.seen_time, h.created_at) DESC LIMIT 10`) + sqlb.WriteString(` ORDER BY h.id DESC LIMIT 10`) sql, args, err := sqlx.In(sqlb.String(), args...) if err != nil { diff --git a/server/datastore/mysql/hosts_test.go b/server/datastore/mysql/hosts_test.go index 16d1c1817f..bd439913e3 100644 --- a/server/datastore/mysql/hosts_test.go +++ b/server/datastore/mysql/hosts_test.go @@ -1017,6 +1017,13 @@ func testHostsSearch(t *testing.T, ds *Datastore) { assert.Nil(t, err) require.Len(t, hosts, 1) assert.Equal(t, hosts[0].ID, h2.ID) + + // sorted by ids desc + filter = fleet.TeamFilter{User: userObs, IncludeObserver: true} + hits, err = ds.SearchHosts(context.Background(), filter, "") + require.NoError(t, err) + assert.Len(t, hits, 3) + assert.Equal(t, []uint{h3.ID, h2.ID, h1.ID}, []uint{hits[0].ID, hits[1].ID, hits[2].ID}) } func testHostsSearchLimit(t *testing.T, ds *Datastore) {