Are your queries taking too long to run? Measure them with the logExecutionTime option.

const allTodos = evolu.createQuery(
  (db) => db.selectFrom("todo").orderBy("createdAt").selectAll(),
    logExecutionTime: true,
    // logExplainQueryPlan: false,

While indexes are not necessary for development, they are almost always required for production. But before adding them, measure and analyze the query first with logExecutionTime and logExplainQueryPlan createQuery options.

If you want to learn what indexes are and how they should be used, check this article squeezing-performance-from-sqlite-indexes (opens in a new tab).


const indexes = createIndexes((create) => [
const evolu = createEvolu(Database, { indexes });

That's all we have to do. Evolu automatically adds new indexes and drops old ones (not listed in the indexes array).

Index Recommendations (SQLite Expert)

SQLite has an excellent CLI tool (opens in a new tab) for index recommendations. Download "Precompiled Binaries" here (opens in a new tab), open a file or create a DB, run .expert, and paste the query SQL there.

To get the query SQL (for copy-pasting to .expert), use the logExecutionTime createQuery options.