【问题标题】:Query optimization or buffering查询优化或缓冲
【发布时间】:2016-03-23 21:54:35
【问题描述】:

我在 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 字段上也已经有一个索引。

variants 表包含 12677 条记录。

model_prices 表包含 2792 条记录。

models 表包含 2792 条记录。

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

这是解释结果:

【问题讨论】:

    标签: ios sqlite fmdb


    【解决方案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)

    【讨论】:

    • 遗憾的是它在 120 毫秒内没有给我结果 :(。我什至通过在 idnooscolor_nomodel_no 字段上添加单独的索引来尝试过度索引. SQLite 是否具有与 MySQL 相同的怪癖,即查询重新格式化程序通过选择不同的计划而搞砸了?
    • @Allendar 。 . .您不想过度索引。您想要答案中提到的复合(多列)索引。
    • 我认识 Gordon,我只是在陈述事实作为测试。之后我恢复了索引。遗憾的是,没有一个 INDEX 组合可以提高执行时间。
    • @Allendar 。 . .您应该通过删除相关的子查询并对其计时来简化查询。然后逐步添加一些复杂性,并尝试随时优化查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多