本帖最后由 purple 于 2013-1-7 11:03 编辑
这句sql- SELECT * FROM T_PENDING WHERE STATE IN (SELECT FLOWSTATERT_ID FROM T_ACTORRT WHERE ACTORID IN('11e0-1f89-c3b1e16d-96da-55b791a571f0','11df-ca19-4a1a129a-adca-dd33fda5e591','11e0-14ac-2800b464-a649-25854b4f76e3','11e0-14b1-584d1b4d-a649-25854b4f76e3','11e0-3d98-e811d1f3-ab19-a198297dc765','11e0-6a56-0b3a80bf-b01d-b5be7e75d097','11df-d5c3-9ce20060-9234-c19050f7abd5') AND PENDING=1) AND FORMID IN('11e1-b435-a030e2b4-a83e-2b636922c0c3','11e1-b4fe-982e9cd8-a83e-2b636922c0c3','11e1-b522-4ceaff34-a83e-2b636922c0c3','11e1-b52e-01837211-a83e-2b636922c0c3','11e1-b5f5-e567903e-a83e-2b636922c0c3') AND SUMMARY IS NOT NULL ORDER BY LASTMODIFIED
复制代码 我mysql下t_pending才4w数据 这句经常慢查询 explain显示查一次就全表扫描 加索引也不行
原因mysql下in语句的子查询有性能问题(where state in(select ....))
建议由
SELECT * FROM T_PENDING WHERE STATE IN (SELECT FLOWSTATERT_ID .... ) AND FORMID IN() AND SUMMARY IS NOT NULL ORDER BY LASTMODIFIED
改为
SELECT * FROM T_PENDING,(SELECT FLOWSTATERT_ID .... ) AS TBT WHERE T_PENDING .STATE = TBT. FLOWSTATERT_ID AND FORMID IN() AND SUMMARY IS NOT NULL ORDER BY LASTMODIFIED
可以有效减少全表扫描
改动前
显示行 0 - 4 ( 5 总计, 查询花费 0.4806 秒) [LASTMODIFIED: 2013-01-04 11:23:28 - 2013-01-05 13:43:44]
改动后
显示行 0 - 4 ( 5 总计, 查询花费 0.0058 秒) [LASTMODIFIED: 2013-01-04 11:23:28 - 2013-01-05 13:43:44] |