在仍然使用索引的同时,如何在MySQL中做相当于MINUS的操作?

问题描述

| 我一直在寻找有关如何执行这样的查询但使用索引的年龄。
SELECT * FROM aliens_tmp 
WHERE creator !=  \'a\'
AND COUNTRY = \'UK\' 
ORDER BY id DESC LIMIT 0,10
我创建的任何索引都不会成功,因为!=与索引的包容性冲突。 所以我想做一个减法
SELECT * FROM aliens_tmp 
WHERE COUNTRY = \'UK 
MINUS
SELECT * FROM aliens_tmp 
WHERE CREATOR = \'a\' 
ORDER BY id DESC LIMIT 0,10
...但是MINUS不存在。所以我看了一下,以为可以使用http://www.bitbybit.dk/carsten/blog/?p=71上提到的旧技巧,
SELECT DISTINCT a.member_id,a.name
FROM a LEFT JOIN b USING (member_id,name)
WHERE b.member_id IS NULL
但这并不能帮助我实现MINUS的最初目标,同时又要保持索引的使用,因为对我自己的表的任何联接仍必须排除我的创建者,这会由于排除而导致遗漏。     

解决方法

如果您的大多数表由带有
creator != \'a\'
的行组成,那么使用索引不会给您带来任何好处。但是,如果大多数行中带有
creator=\'a\'
,则可以考虑将此类值分配给创建者(或使用枚举),如果按创建者\'a \'进行排序,则该值将排在第一位。而不是检查
creator != \'a\'
,您可以使用
creator > \'a\'
条件,这对于使用btree索引非常合适。 有关创作者的更多信息后更新: 因此,您的“ 3”条件的选择性极低,并且尝试在创建者上使用索引毫无意义。您正在限制结果并按id desc排序,因此应该使用country上的键来返回尽可能少的行,方法是简单地检查从最高id开始的每一行是否满足条件,直到满足您的限制为止。如果在[ѭ8]中看到键:国家/地区和接近10的行数,则速度不会更快。     ,在这种情况下,索引不会为您带来任何收益,您以9开头的原始查询将是您最快的选择。 原因是要执行您正在讨论的MINUS,数据库将需要检索所有行,然后对照索引检查每一行以确定是否应将其删除。这就要求它检查表中的每一行。 您的原始查询也将需要检查每行,但仅需要检查它是否符合您指定的条件。 这意味着即使进行了您描述的“ 10”操作,您的原始查询也会更快。 实际上,您的原始查询可能会更快,因为它只需要检查条件,而不必对每一行进行索引查找。     ,即使可以使用创建者索引也可能不是很有用。 != a可能返回表中一半以上的行。在这种情况下,表扫描将比使用索引更有效。假设有多个国家/地区,则有关国家/地区MIGHT帮助的索引会有所帮助,但是如果您的用户中有一半在英国,那么那里也会有同样的问题。 如果对您的应用程序有意义,则可以考虑将数据分为两个表,即\'a \'创建者和\'not a \'创建者。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...