我目前有一张名为map_tiles
的表,最终将拥有数十万行。这个表中的每一行都代表了我的游戏世界地图上的一个独立瓦片。目前,表结构如下:
id int(11) PRIMARY KEY
city_id int(11)
type varchar(20)
x int(11) INDEX KEY
y int(11) INDEX KEY
level int(11)
我也希望能够存储一个字符串化的JSON对象,其中包含关于特定瓷砖的信息。由于我可能有100,000+ 行数据,因此我希望优化我的查询和表设计,以获得最佳性能。
所以这是我的情况:玩家加载位置,比如在世界地图上的50,50。我们将加载玩家坐标周围25个瓷砖内的所有瓷砖。因此,我们必须在我的map_tiles
表中的数十万行数据上运行一个WHERE
查询。
那么,在现有表中添加一个类型为text
的其他字段,称为data
,是否会提供更好的性能?但是,这会减缓主查询的速度。
或者,是否值得创建一个单独的名为map_tiles_data
的表,其仅具有以下结构:
tile_id int(11) PRIMARY KEY
data text
我可以运行主查询,从map_tiles
中找到玩家半径内的瓷砖,然后可能执行一个仅从第二个表中提取经过JSON字符串化的data
的UNION ALL
操作?
编辑:抱歉,我应该澄清一下。如果使用第二个表,则不会为map_tiles
表中的每个相应瓷砖添加一行。只有在需要存储地图瓦片上的数据时才会添加一行。因此,默认情况下,在map_tiles_data
表中将没有任何行,而在map_tiles
表中可能会有100,000条记录。当玩家执行操作x时,游戏会向map_tiles_data
添加一行。
map_tiles
数据库中提取行的查询都会利用 JSON 数据,除了可能只有一个查询,该查询仅在运行另一个主要查询的 1% 的时间内运行。 - josh