2012-09-15 78 views
0

我有这个复杂的查询,我需要优化。 没有索引需要20ms,我试着添加一些索引,它更好,现在我有4ms。 但我没有任何经验。你能帮我把它变得更快吗?如何优化索引sql查询

SELECT COUNT(*) FROM(
    SELECT user_id FROM times 
     INNER JOIN tags ON times.user_id = tags.tag_id 
     INNER JOIN users ON tags.user_nr = users.nr 
     WHERE (times.time < 1597313) 
     AND (times.run_id="118") 
     AND (times.user_id != 109330258) 
     AND (times.user_id != 0) 
     AND (times.time != 0) 
     AND (times.cell != 1) 
     AND (users.category_id="4") 
     GROUP BY user_id HAVING count(*) == 1 
    UNION 
    SELECT user_id FROM times 
    INNER JOIN tags ON times.user_id = tags.tag_id 
    INNER JOIN users ON tags.user_nr = users.nr 
    WHERE (times.run_id="118") 
    AND (times.user_id != 109330258) 
    AND (times.user_id != 0) 
    AND (times.time != 0) AND (times.cell != 1) 
    AND (users.category_id="4") 
    GROUP BY user_id HAVING count(*) > 1 
    ) 

我增加了3个索引。

  • 表标签 - 标签识别
  • 表倍 - user_id说明
  • 表用户 - NR
+1

是MySQL还是SQLite?你标记为 – pickypg

+0

“更好,现在我需要4ms”。现在多少钱?你在这些表中有多少数据?你是如何确定要添加哪些索引的?查询计划(解释)是什么样的? – Oded

+0

其sqlite(标记删除),现在我有4毫秒(编辑) – Meloun

回答

0

你也应该尝试索引tags.user_nr,但它不可能给出一个明确的答案,而不会看到查询计划。