我有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
你应该还会发布查询中涉及的表和您拥有的其他索引。 –
尝试使用JOIN ....将所有IN语句移动到JOIN。作为WHERE子句只保留WHERE(p.status = 1 OR(p.status!= 2 && p.flagged <3))。 – gview
在performance表的'track'列上创建索引会给出所需的行为(查询不会加入所有100,000行的“轨迹”。) – Bala