Optimization 如何优化SQLite3查询

Optimization 如何优化SQLite3查询,optimization,sqlite,Optimization,Sqlite,我正在通过一本书(“使用SQLite”)和Northwind数据库学习SQLite3。我编写了下面的代码,按照客户所在城市的客户数量,然后按照其姓名的字母顺序对客户进行排序 SELECT ContactName, Phone, City as originalCity FROM Customers ORDER BY ( SELECT count(*) FROM Customers WHERE city=originalCity) DESC, Co

我正在通过一本书(“使用SQLite”)和Northwind数据库学习SQLite3。我编写了下面的代码,按照客户所在城市的客户数量,然后按照其姓名的字母顺序对客户进行排序

SELECT ContactName, Phone, City as originalCity 
FROM Customers
ORDER BY (
      SELECT count(*) 
      FROM Customers 
      WHERE city=originalCity) 
   DESC, ContactName ASC
运行大约需要50-100毫秒。是否有一个标准的过程来优化此查询,或者更一般地说,优化其类型的查询?

通常(不仅仅是SQLite),最好一次对所有值(城市)进行计数,并通过连接来构造查询:

    SELECT ContactName, Phone, Customers.City as originalCity
      FROM Customers
      JOIN (SELECT city, count(*) cnt
              FROM Customers
          GROUP BY city) Customers_City_Count
        ON Customers.city = Customers_City_Count.city
  ORDER BY Customers_City_Count.cnt DESC, ContactName ASC

(为了防止像您的情况一样,对同一个值(城市)多次计算计数))

在最常见的情况下,查询优化从开始。在SQLite中,您只需使用

EXPLAIN QUERY PLAN statement
就你而言

EXPLAIN QUERY PLAN
SELECT ContactName, Phone, City as originalCity 
FROM Customers
ORDER BY (
      SELECT count(*) 
      FROM Customers 
      WHERE city=originalCity) 
   DESC, ContactName ASC
您可能还需要读取的输出

EXPLAIN statement
这就进入了