2011-10-14 98 views
0

我有100,000行,并且此查询有时可能需要2秒以上。我试图优化它,并成功将DESC创建的字段编入索引。我试图进一步优化这个查询,并且想知道这个查询是否真的加入了所有100,000行的“轨道”,而不仅仅是我实际需要的12个。这可能会导致一个较慢的查询?MySql加入后选择 - 慢速查询

查询:

SELECT `p`.`id` as performance_id, `p`.`performers`, `t`.`name` as track_name, `p`.`location`, `p`.`fms_id` 
FROM (`performances` p) 
JOIN `tracks` t ON `p`.`track` = `t`.`id` 
WHERE (p.status = 1 OR (p.status != 2 && p.flagged < 3)) 
AND `p`.`prop` IN ('1', '2', '3', '4', '5', '6', '8', '10', '11', '13') 
AND `p`.`track` IN ('17', '9', '5', '15', '2', '3', '8', '6', '12', '4', '1') 
AND `p`.`type` IN ('1', '0', '2') 
ORDER BY `p`.`created` desc 
LIMIT 0, 12 

说明:曲目列表

1 SIMPLE p index track,prop,flagged,status,type created_desc 5 NULL 239 Using where 
1 SIMPLE t eq_ref PRIMARY PRIMARY 4 database_name.p.track 1 Using where 
+0

你应该还会发布查询中涉及的表和您拥有的其他索引。 –

+0

尝试使用JOIN ....将所有IN语句移动到JOIN。作为WHERE子句只保留WHERE(p.status = 1 OR(p.status!= 2 && p.flagged <3))。 – gview

+1

在performance表的'track'列上创建索引会给出所需的行为(查询不会加入所有100,000行的“轨迹”。) – Bala

回答

1

使用临时表,并加入与主查询,而不是使用 'IN' 子句临时表。通常,避免使用IN子句,因为列表中的项目数量增加,查询计划可能会发生变化。

创建上表演台的“跟踪”列索引会得到期望的行为(查询不会加入“轨道”上的所有100,000行。)

http://apps.ycombinator.com/item?id=2206406

http://dbaspot.com/sybase/240012-plan-change-clause-number-set-elements-print.html

+0

临时表为什么要比IN更高效? –

+0

或者添加一个合适的索引。 –

+0

编辑回复以清除问题 – Bala