我有一个包含几百万行的表,同时有几个客户端正在访问这个表,每个表需要获得20个唯一的行,然后需要排在最后一行。
我的设置是:
表格结构:
id | last_access | reserved_id | [Data columns]
id + last_access is indexed
为了选择20个唯一行,我使用以下内容:
UPDATE "table" SET "reserved" = 'client-id_timestamp' WHERE "reserved" = ''ORDER BY "last_access" ASC LIMIT 20
此更新查询性能非常差,这就是我要问的原因:
我的具体要求是否有更好的解决方案?可能是另一个表结构?
答案 0 :(得分:1)
last_access是日期列吗?尝试用整数值表示它(即自1970-01-01以来的秒数),排序可能会更快。
第二个性能问题可能来自更改“保留”字段后重新索引表的需要。如果从该列中删除索引,性能可能会提高。虽然搜索需要更长的时间,但更昂贵的重新索引却被抛弃了。
如果您使用的是MySQL 5.6.3或更高版本,则可以使用查询执行EXPLAIN,以找出最长时间的内容。