优化mysql语句

时间:2011-05-24 14:30:49

标签: mysql

我有一个大约1 128 910行的表,现在我的SQL语句开始运行得很慢。

我的表格如下:

SU_Id   SU_User SU_Skill SU_Value SU_Date
int(10) int(10) int(10)  float    int(10)
1       1       23       45.34    1300978612
2       1       23       48.51    1300978865
3       1       23       47.21    1300979203
4       3       23       61.01    1300979245
5       2       23       38.93    1300979412
6       1       17       12.76    1300979712
7       2       23       65.30    1300979998

如在SU_Skill中所见,用户可以拥有多个具有相同技能编号的条目。 SU_Value保持技能的值,它可以上下。 SU_Date保存添加值的日期。

我想要一个SQL语句,用于选择技能的20个当前最高值。以下SQL语句是我今天使用的,但它很慢,我认为有更好的方法。

SELECT DISTINCT SU_User AS Player,
(SELECT SU_Value FROM WOU__SkillUploads WHERE SU_User = Player AND SU_Skill = 23 ORDER BY SU_Date DESC LIMIT 1) AS Value
FROM WOU__SkillUploads
WHERE SU_Skill = 23
ORDER BY Value DESC LIMIT 20

有更快的方法吗?感谢您阅读我的问题!

2 个答案:

答案 0 :(得分:1)

子选择非常慢,特别是在你使用它的方式。

将其重写为JOIN。在这种情况下,因为你想要来自SkillUploads的所有记录,其中SU_SKILL = 23,这应该是一个正确的连接。

答案 1 :(得分:1)

同一个用户可以多次进入结果吗?这可能适合你。

SELECT SU_USER, MAX(SU_VALUE)
FROM WOU_SKILLUploads
WHERE SU_SKILL=23
GROUP BY SU_USER
ORDER BY MAX(SU_VALUE) DESC
LIMIT 20