Mysql 不同地索引三列
我有以下两个SQL在大数据集上不断运行:Mysql 不同地索引三列,mysql,sql,performance,indexing,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) (blo
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表有很多索引时,它的行为如何?简短回答-更多索引会增加数据库的大小。几乎总是(除非你有算法问题)提高速度——你会使用更多的内存(空间)。这取决于你的真正目标
- 查询是否会干扰其他活动,并且您需要它们少一些干扰?如果是这样的话,我将使用
以1K行为单位遍历该表李>id
- 你急着找工作吗?我假设当查询找到带有这些标志的行时,您会采取一些操作。如果是这样的话,我会添加
,在一个上工作李>和id>$where_left_off ORDER BY id LIMIT 1
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;
它将在一次传递中有效地收集两个查询的数据。(如果不方便,请更改中的位置。
连接具有以下效果:使用b
,只扫描新索引的一部分(活动的部分=1
),然后查找其余数据(a
)
如果您正在“处理”找到的行,我建议您添加一个限制
,否则您的客户机可能会在很少有行数过多的情况下被太大的列表阻塞。(活动、删除、阻止)
应该可以完成这项工作。不是真的,因为它如何首先索引删除,第二个是活动的?我认为这实际上取决于“活动”、“阻止”和“删除”记录上的数据分布。有效/总比率是多少?是否仅尝试添加“活动”索引?