Room中外键属主键却未被索引的警告问题解决方法问询
解决Room中复合主键外键的索引警告问题
你遇到的这个警告本质是复合主键的索引特性导致的:你的participants表用(tournamentId, playerId)作为复合主键,Room会自动为这个复合主键创建索引,但这个索引是前缀匹配的——只有查询条件包含tournamentId时,才能利用这个索引。
当players表发生修改(比如删除某个玩家),数据库需要找到participants表中所有关联该玩家的记录,此时查询条件只有playerId,无法匹配复合主键的前缀,只能触发全表扫描,所以Room会提示你给playerId单独创建索引。
解决方法很简单,给playerId添加单独的索引即可,有两种实现方式:
方式一:在字段上直接添加@Index注解
@Entity( tableName = "participants", foreignKeys = [ ForeignKey( entity = TournamentEntity::class, parentColumns = ["id"], childColumns = ["tournamentId"], onDelete = ForeignKey.CASCADE ), ForeignKey( entity = PlayerEntity::class, parentColumns = ["id"], childColumns = ["playerId"], onDelete = ForeignKey.CASCADE ) ], primaryKeys = ["tournamentId", "playerId"] ) data class ParticipantEntity( var tournamentId: Long, @Index var playerId: Long )
方式二:在@Entity的indices参数中定义索引
@Entity( tableName = "participants", foreignKeys = [ ForeignKey( entity = TournamentEntity::class, parentColumns = ["id"], childColumns = ["tournamentId"], onDelete = ForeignKey.CASCADE ), ForeignKey( entity = PlayerEntity::class, parentColumns = ["id"], childColumns = ["playerId"], onDelete = ForeignKey.CASCADE ) ], primaryKeys = ["tournamentId", "playerId"], indices = [Index(value = ["playerId"])] ) data class ParticipantEntity( var tournamentId: Long, var playerId: Long )
添加索引后,数据库在处理players表的修改操作时,能快速定位到participants表中的关联记录,避免全表扫描,同时也能优化单独基于playerId的查询性能。
内容的提问来源于stack exchange,提问作者Tey44
相关产品推荐
相关产品推荐

