2011-09-19 54 views
1

我正在使用请求从10个表中选择数据,并且最后我有WHERE和2个条件 第一个很简单,但第二个很慢,即使有没有结果返回。来自多个表的MySQL请求由于WHERE过滤器而变得缓慢

AND (eligible_users.id IS NULL OR 
((eligible_users.program = 3 AND eligible_users.status = 0) 
OR eligible_users.status = 35)) 

当我将其删除,页面加载速度快很多,有一些方法,使其更快,但仍保持这种过滤器,因为我需要它。

+2

你在查询上运行EXPLAIN了吗?它说什么? – jasonbar

+0

也许你需要在你的“状态”列上有一个索引。你可以像这样添加它:'CREATE INDEX status_index ON eligible_users(status);' –

+1

另外,我第二个@jasonbar说的。 EXPLAIN的输出将解释你的查询是如何评估的。它会告诉你,如果你在任何地方缺少索引。 –

回答

0

您在查询3条OR语句,尝试他们分成1个或多个工会,像这样:

select ... 
where ... 
eligible_users.id IS NULL 
UNION 
select ... 
where ... 
(eligible_users.program = 3 AND eligible_users.status = 0) 
OR eligible_users.status = 35 
+0

然后,我不能使用它的订单不起作用,因为如果它是一个查询 – JohnU43

+0

@ JohnU43是的,你可以:'select * from(select ... union select ...)t order by t.your_column' – Icarus

0

增加两个指标,一个是程序,一个用于状态可能会很好地加快速度。

+0

你的意思是索引在表本身,即使它们没有在请求中使用 – JohnU43

+0

@ JohnU43是,索引在表上,对于这些特定的字段。索引应该可以帮助数据库更快地评估你的where子句。 –