以不同方式索引三列

时间:2016-03-02 11:19:25

标签: mysql sql performance indexing

我有以下两个SQL在大数据集上不断运行:

SELECT * FROM table t WHERE (deleted = 1 OR blocked = 1) AND active = 1;

SELECT * FROM table t WHERE active = 1 AND deleted = 0 AND blocked = 0;

现在的表只有ID上的主键 - 我应该添加哪些索引来提高这些查询的性能? (现在他们需要3分钟才能获得大约一百万条记录)。

我一直在考虑索引:

(deleted, active)
(blocked, active)
(active, deleted, blocked)

我想这可以解决问题,但不是指数太多了吗? mysql表有多少索引时如何表现?

2 个答案:

答案 0 :(得分:0)

简短回答 - 更多索引会增加数据库的大小。几乎总是(除非你有算法问题)提高速度 - 你使用更多的内存(空间。)

答案 1 :(得分:0)

这取决于你的真正目标。

  • 查询是否会干扰其他活动,您是否需要减少干扰?如果是这样,我会使用id以1K行的方式遍历表格。 Chunking discussion
  • 你是否急于寻找可以工作的东西?我假设您在查询找到带有这些标志的行时执行某些操作。如果是这样,我会添加AND id > $where_left_off ORDER BY id LIMIT 1,对其进行处理。 Pagination discussion

这是第3种方法:

INDEX(active, deleted, blocked, id) -- Active must be first; id must be last

SELECT a.*
    FROM table a
    JOIN table b  ON a.id = b.id
    WHERE b.active = 1
      AND b.deleted = b.blocked;

它将在一次通过中有效地收集两个查询的数据。 (如果不方便,请更改WHERE。)JOIN会产生此效果:使用b,只扫描新INDEX的部分内容(active=1部分a 1}}),然后查找其余数据(LIMIT)。

如果你正在处理"找到的行,我建议你添加一个facto,否则你的客户可能会在极少数行的情况下呛到太大的列表。