SELECT COUNT(*) AS count_all, products.id AS products_id
FROM `products`
INNER JOIN `product_device_facilities`
ON `product_device_facilities`.`product_id` = `products`.`id`
INNER JOIN `product_vendors`
ON `product_vendors`.`ProductId` = `products`.`id`
INNER JOIN `screen_shots`
ON `screen_shots`.`ProductVendorId` = `product_vendors`.`id`
WHERE ( (DownloadCount >= 10 or DownloadCount is NULL)
and (Minsdk <= 10 or Minsdk is null))
GROUP BY products.id
HAVING GROUP_CONCAT(device_facility_id ORDER BY device_facility_id ASC ) IN (0)
对于100k记录,这需要10秒钟。
如何改善表现?
答案 0 :(得分:4)
您可以尝试一些事项。
如果所有其他方法都失败了
编辑
答案 1 :(得分:1)
对表上的连接列进行索引而不是使用count(*)使用count(某些索引的主键列)。
答案 2 :(得分:1)
minsdk和下载计数是否在同一个表中?如果是这样的话,在这两者上添加索引可能有所帮助。
这可能是一个很难/不可能的快速查询。如果没有看到完整的架构和数据,那么很难具体,但是将它分成几个更容易执行的查询可能会更快。或者正如Amadeus建议的那样可能会对数据进行非规范化。
另一个变化是只需花费10秒就可以忍受,但要确保它总是在后台定期(使用cron或类似),而不是在用户等待时。然后花时间修复它,如果/需要几分钟而不是几秒钟,否则会给您的用户体验或服务器带来不可接受的负担。