我有100,000行,此查询有时可能需要2秒钟。我正在尝试优化它并成功使用DESC索引“创建”字段。我正在尝试进一步优化这个查询,我想知道这个查询是否实际上加入了所有100,000行的“轨道”,而不仅仅是我实际需要的12个。这会导致查询速度变慢吗?
查询:
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 :(得分:1)
将临时表用于轨道列表,并将该临时表与主查询连接,而不是使用“IN”子句。通常,避免使用IN子句,因为查询计划中的项目数量可能会增加。
在性能表的“track”列上创建索引会产生所需的行为(查询不会加入所有100,000行的'tracks'。)
http://apps.ycombinator.com/item?id=2206406
http://dbaspot.com/sybase/240012-plan-change-clause-number-set-elements-print.html