查询优化或缓冲

时间:2016-03-23 13:46:36

标签: ios sqlite fmdb

我在iOS应用上有这个查询:

EXPLAIN QUERY PLAN SELECT
    m.`id`, m.`no`, m.`name`, m.`image`, m.`stock`,
    mp.`unit_price_from`, mp.`unit_list_price_from`, mp.`unit_price`, mp.`unit_list_price`,
    (SELECT COUNT(`color_no`) FROM `variants` WHERE `model_no` = m.`no`) AS `variants_count`,
    (SELECT COUNT(DISTINCT `color_no`) FROM `variants` WHERE `model_no` = m.`no`) AS `styles_count`
FROM `models` m
LEFT JOIN `model_prices` mp ON mp.`model_id` = m.`id`
WHERE
    `noos` = 2 OR `noos` = 1

在MacBook上的模拟器上,这只需124ms144ms。我在model_no,color_no以及它们的组合变体上尝试了不同的INDEXES但它们并没有导致更快的查询。在iPad 3上,将查询减慢到640ms会变得更加繁琐。这给应用程序的感觉带来了一个小小的打嗝,我真的想要摆脱它。

models表在noos字段上也有一个INDEX。

variants表包含12677条记录。

model_prices表包含2792条记录。

models表包含2792条记录。

我想知道是否有某种方法可以改进COUNT子查询以在SQLite中获得更快的结果。我只想使用某种手动缓存作为最后的手段,但是想先看看有些人是否会在这里看到一些优化可能性。

这是EXPLAIN的结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

对于此查询:

SELECT m.`id`, m.`no`, m.`name`, m.`image`, m.`stock`,
       mp.`unit_price_from`, mp.`unit_list_price_from`, mp.`unit_price`, mp.`unit_list_price`,
       (SELECT COUNT(`color_no`) FROM `variants` WHERE `model_no` = m.`no`) AS `variants_count`,
       (SELECT COUNT(DISTINCT `color_no`) FROM `variants` WHERE `model_no` = m.`no`) AS `styles_count`
FROM `models` m LEFT JOIN
     `model_prices` mp
      ON mp.`model_id` = m.`id`
WHERE m.`noos` IN (1, 2);

最佳索引应为:models(noos, id)model_prices(model_id)variants(model_no, color_no)