diff --git a/data.go b/data.go
index 558c133..f3ffcd1 100644
--- a/data.go
+++ b/data.go
@@ -87,43 +87,15 @@
 }
 
 func (dbc *dbManager) initDb() error {
-	tx, err := dbc.getDb().Begin()
-	if err != nil {
-		return err
-	}
-	defer tx.Rollback()
-	_, err = tx.Exec(`
-	CREATE TABLE IF NOT EXISTS APID_BLOB_AVAILABLE (
-		id text primary key,
-   		local_fs_location text NOT NULL
-	);
-	`)
-	if err != nil {
-		return err
-	}
-	_, err = tx.Exec(`
-	CREATE TABLE IF NOT EXISTS APID_CONFIGURATION_LSN (
-		lsn text primary key
-	);
-	`)
-	if err != nil {
+	if err := initTables(dbc.getDb()); err != nil {
+		log.Errorf("error in initTables(): %v", err)
 		return err
 	}
 
-	// insert a row if APID_CONFIGURATION_LSN is empty
-	_, err = tx.Exec(`
-	INSERT INTO APID_CONFIGURATION_LSN (lsn)
-	SELECT '0.0.0'
-	WHERE NOT EXISTS (SELECT * FROM APID_CONFIGURATION_LSN)
-	`)
-	if err != nil {
-		return err
+	if err := addIndexes(dbc.getDb()); err != nil {
+		// not on critical path, continue in case of error
+		log.Errorf("error in addIndexes(): %v", err)
 	}
-
-	if err = tx.Commit(); err != nil {
-		return err
-	}
-	log.Debug("Database table APID_BLOB_AVAILABLE, APID_CONFIGURATION_LSN created.")
 	return nil
 }
 
@@ -512,3 +484,61 @@
 	}
 	return v.Interface(), nil
 }
+
+func initTables(db apid.DB) error {
+	tx, err := db.Begin()
+	if err != nil {
+		return err
+	}
+	defer tx.Rollback()
+	_, err = tx.Exec(`
+	CREATE TABLE IF NOT EXISTS APID_BLOB_AVAILABLE (
+		id text primary key,
+   		local_fs_location text NOT NULL
+	);
+	`)
+	if err != nil {
+		return err
+	}
+	_, err = tx.Exec(`
+	CREATE TABLE IF NOT EXISTS APID_CONFIGURATION_LSN (
+		lsn text primary key
+	);
+	`)
+	if err != nil {
+		return err
+	}
+
+	// insert a row if APID_CONFIGURATION_LSN is empty
+	_, err = tx.Exec(`
+	INSERT INTO APID_CONFIGURATION_LSN (lsn)
+	SELECT '0.0.0'
+	WHERE NOT EXISTS (SELECT * FROM APID_CONFIGURATION_LSN)
+	`)
+	if err != nil {
+		return err
+	}
+
+	if err = tx.Commit(); err != nil {
+		return err
+	}
+	log.Debug("Database table APID_BLOB_AVAILABLE, APID_CONFIGURATION_LSN created.")
+	return nil
+}
+
+func addIndexes(db apid.DB) error {
+	log.Debug("add index to sqlite")
+	tx, err := db.Begin()
+	if err != nil {
+		return err
+	}
+	defer tx.Rollback()
+	// add indexes
+	_, err = tx.Exec(`
+	CREATE INDEX IF NOT EXISTS config_type on METADATA_RUNTIME_ENTITY_METADATA (type);
+	`)
+	if err != nil {
+		return err
+	}
+	return tx.Commit()
+}
