Run Faster
曰:刘郎已恨蓬山远,更隔蓬山一万重
昨天跟张志桐探讨了一下OJ某页面的SQL优化的问题。为防遗忘,特此记录。
测试的SQL
Query #1
- SELECT
- Problems.Proid,Title,ACproblem.Totalsubmit
- FROM
- Problems,
- (SELECT Proid , count(*) AS Totalsubmit FROM Status
- WHERE Contestid = 0 AND Author = "patrick1234"
- GROUP BY Proid
- HAVING Proid in
- (SELECT Proid FROM Status WHERE Contestid = 0 AND Author = "patrick1234" AND JudgeStatus = -1002)
- )
- AS ACproblem
- WHERE Problems.Proid = ACproblem.Proid;
Query #2
- SELECT
- Status.Proid,Title,count(*) as Totalsubmit
- FROM
- `Status` , `Problems`
- WHERE Problems.Contestid = 0 AND Status.Proid = Problems.Proid AND `Author` = "patrick1234"
- GROUP BY Status.Proid
- HAVING Proid in
- (SELECT Proid FROM Status WHERE Contestid = 0 AND `Author` = "patrick1234" AND JudgeStatus = -1002)
- ORDER BY Status.Proid;
Query #3
- SELECT p.Proid, Title, ac.ac, ac.total FROM
- (SELECT Proid, COUNT(CASE WHEN JudgeStatus = -1002 THEN 1 ELSE NULL END) AS ac, COUNT(*) AS total
- FROM Status WHERE Author = "patrick1234" and Contestid = 0 GROUP BY Proid) AS ac
- LEFT JOIN Problems AS p ON p.Proid = ac.Proid
- WHERE ac.ac > 0
执行时间比较
| Query | Time(seconds) |
|---|---|
| #1 | 0.12727000 |
| #2 | 0.08309100 |
| #3 | 0.03952900 |
Profile 信息
Query #1
| Status | Duration |
|---|---|
| starting | 0.000031 |
| checking query cache for query | 0.000165 |
| Opening tables | 0.000049 |
| System lock | 0.000007 |
| Table lock | 0.000141 |
| optimizing | 0.000025 |
| statistics | 0.000177 |
| preparing | 0.000026 |
| Creating tmp table | 0.000030 |
| executing | 0.000005 |
| Copying to tmp table | 0.048290 |
| Sorting result | 0.000038 |
| optimizing | 0.000024 |
| statistics | 0.000133 |
| preparing | 0.075577 |
| Sending data | 0.000100 |
| removing tmp table | 0.000009 |
| Sending data | 0.000029 |
| init | 0.000026 |
| optimizing | 0.000010 |
| statistics | 0.000026 |
| preparing | 0.000013 |
| executing | 0.000002 |
| Sending data | 0.002261 |
| end | 0.000008 |
| query end | 0.000003 |
| freeing items | 0.000042 |
| storing result in query cache | 0.000003 |
| removing tmp table | 0.000008 |
| closing tables | 0.000006 |
| logging slow query | 0.000002 |
| cleaning up | 0.000004 |
Query #2
| Status | Duration |
|---|---|
| starting | 0.000030 |
| checking query cache for query | 0.000168 |
| Opening tables | 0.000025 |
| System lock | 0.000007 |
| Table lock | 0.000061 |
| init | 0.000097 |
| optimizing | 0.000029 |
| statistics | 0.003208 |
| preparing | 0.000060 |
| Creating tmp table | 0.000058 |
| executing | 0.000025 |
| Copying to tmp table | 0.015100 |
| Sorting result | 0.000056 |
| optimizing | 0.000030 |
| statistics | 0.000764 |
| preparing | 0.063109 |
| Sending data | 0.000185 |
| end | 0.000003 |
| removing tmp table | 0.000010 |
| end | 0.000006 |
| query end | 0.000003 |
| freeing items | 0.000042 |
| storing result in query cache | 0.000008 |
| logging slow query | 0.000002 |
| cleaning up | 0.000005 |
Query #3
| Status | Duration |
|---|---|
| starting | 0.000030 |
| checking query cache for query | 0.000173 |
| Opening tables | 0.000025 |
| System lock | 0.000006 |
| Table lock | 0.000115 |
| optimizing | 0.000023 |
| statistics | 0.000178 |
| preparing | 0.000025 |
| Creating tmp table | 0.000030 |
| executing | 0.000005 |
| Copying to tmp table | 0.037741 |
| Sorting result | 0.000069 |
| Sending data | 0.000101 |
| removing tmp table | 0.000008 |
| Sending data | 0.000023 |
| init | 0.000032 |
| optimizing | 0.000012 |
| statistics | 0.000024 |
| preparing | 0.000015 |
| executing | 0.000002 |
| Sending data | 0.000834 |
| end | 0.000004 |
| query end | 0.000003 |
| freeing items | 0.000032 |
| storing result in query cache | 0.000003 |
| removing tmp table | 0.000005 |
| closing tables | 0.000005 |
| logging slow query | 0.000002 |
| cleaning up | 0.000004 |
