我在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上的模拟器上,这只需124ms
和144ms
。我在model_no,color_no以及它们的组合变体上尝试了不同的INDEXES但它们并没有导致更快的查询。在iPad 3上,将查询减慢到640ms
会变得更加繁琐。这给应用程序的感觉带来了一个小小的打嗝,我真的想要摆脱它。
models
表在noos
字段上也有一个INDEX。
variants
表包含12677条记录。
model_prices
表包含2792条记录。
models
表包含2792条记录。
我想知道是否有某种方法可以改进COUNT子查询以在SQLite中获得更快的结果。我只想使用某种手动缓存作为最后的手段,但是想先看看有些人是否会在这里看到一些优化可能性。
这是EXPLAIN的结果:
答案 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)
。