我有以下两个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表有多少索引时如何表现?
答案 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
,否则你的客户可能会在极少数行的情况下呛到太大的列表。