我的浏览器游戏有一个私人消息系统。当我使用查询检查大部分CPU时间时,我看到该表是使用一个CPU的最多CPU。我不熟悉索引,查询时间优化。所以我想获得有关此表的优化提示。
好了,我现在要先向你展示桌面结构:
结构图片
好的,下面的查询会读取用户拥有多少条未读消息,并且此查询是使用一条消息的CPU最多,因为它在每次页面加载时读取:
SELECT COUNT([Id]) [Number]
FROM [MyTable]
WHERE [ReceiverUserId] = @1
AND [ReceiverReaded] = @2
AND [ReceiverDeleted] = @3
那么什么样的索引等可以提高我的表现?
答案 0 :(得分:4)
为什么要在这些列上允许NULL - 无论是否读取。默认为0.然后对Read / Deleted / ReceivedUser进行索引(按此顺序,如果您需要大量的ALL READ访问权限,它们将被“分区”,或者,如果大多数读取仅适用于单个用户,则在ReceivedUser上放置一个索引)
您要做的是查看您的索引。在您的情况下,您可以在ReceiverUserId和INCLUDE列上放置一个索引ReceiverReaded和ReceiverDeleted,它将覆盖(对于该查询)。在执行计划中,您应该只看到索引查找,因为您只有一个用户。
您可以捕获工作负载,然后通过SQL Server中的索引调整向导运行它,它可能会提供很好的建议。当然,你需要解释它告诉你的内容。
答案 1 :(得分:3)
您总是希望索引所搜索的字段,因此您可以通过在[ReceiverUserId],[ReceiverReaded]和[ReceiverDeleted]上添加索引来提高查询性能。
当然,您索引的列越多,UPDATES和INSERTS的速度就越慢。
答案 2 :(得分:3)
db优化中一个相当简单的经验法则是索引在WHERE子句或JOIN中作为谓词的一部分出现的任何列。从您的示例中可以看出:
还有一些优化工具可用于“观察”您的数据库,并告诉您索引哪些列以获得最佳性能。
答案 3 :(得分:2)
答案 4 :(得分:2)
适用于您的应用程序的不同方法:当用户未明确请求任何内容时,请不要查询消息表,例如:当他不在你游戏的“消息”部分时。
尝试使用整数值列扩展您的用户表,指示有多少消息以及已经读取了多少消息。每次修改消息表时,还要修改用户表中的相应值。
这样,您无需在每次刷新时查看整个表格。但请注意,此方法的低迷是程序员的一些额外同步工作。如果你已经正确地封装了消息表的修改(添加消息,阅读消息,删除消息),这应该不是问题。