我们有一些大型表,正在尝试优化。 (注意:在这个例子中,id,user_id和delete都有索引)。
闪电般快速:
select *
from sites
where (sites.id = 242 and sites.user_id = 425)
select *
from sites
where (sites.id = 242 or sites.user_id = 425)
但是,一旦我们添加任何混合条件检查,它只是坦克
select *
from sites
where (sites.id = 242 or sites.user_id = 425) and sites.deleted = 1
我们发现此查询(hack)有效,但我们目前正在使用SQLAlchemy进行查询构建,并希望避免任何子查询
select *
from sites
where (sites.id = 242 or sites.user_id = 425) and site.id in (
select id from sites where sites.deleted = 1
)
让我感到困惑的是mysql在混合大小写中窒息。但无论如何要优化这个吗?
答案 0 :(得分:1)
您可以尝试添加复合索引 user_id,is_deleted(顺序很重要,我不确定哪种方式对这种特定情况会更好)。如果您主要搜索单个或有限数量的user_id,则此顺序将是正确的方式。
这可能会帮助你。
ID是您唯一的主键吗?如果是这样,如果它被删除,你需要搜索它吗?
如果可用,您可以使用UNION,因为主键搜索速度非常快。
布赖恩