我正在开发游戏,并将汽车的车牌号与拥有汽车的用户相关联。
当我执行第一个查询以查找汽车的所有者时,大约需要花费时间。 1秒
SELECT aid FROM owned_vehicles INNER JOIN users ON users.identifier = owned_vehicles.owner WHERE vehicle LIKE '%04IBQ509%' LIMIT 1
这将导致aid
,它与拥有汽车的用户的主键有关。在这种情况下
aid
11
但是当我在另一个车牌号上使用相同的查询时,加载数据需要30秒钟以上(当用户抱怨加载时间和超时消息时发现了这个问题)
SELECT aid FROM owned_vehicles INNER JOIN users ON users.identifier = owned_vehicles.owner WHERE vehicle LIKE '%85RAF179%' LIMIT 1
超过30秒后,结果为5475
。这辆新车要花更多的时间怎么可能?
在尝试解决此问题时,我已经在HeidiSQL(MySQL GUI)中执行了该查询,并且还导致执行时间异常
我试图创建车辆列的索引以加快速度。但这没有什么区别。
有人知道如何解决我的问题并加快查询速度吗? (执行最多需要2秒)
答案 0 :(得分:1)
您在开始时使用通配符LIKE
执行%
。这排除了在车辆列上使用任何索引的可能性。如果您在车辆编号的开头删除%
,然后在该列中添加索引,则会发现性能得到了极大的改善。当然,这会改变查询的性质,但是从目前的情况来看,您正在对owned_vehicles
表执行表扫描,这对于以游戏中的任何规律性执行的查询来说都是不可持续的。
看到上面的注释,您的车辆列实际上是JSON数据。您需要重新考虑存储方式。如果您需要非常快速地查询带有注册号的车辆,则需要将该注册提取到另一列,将其编入索引并通过该列进行过滤。尝试根据JSON字符串的LIKE
进行过滤不是RDBMS的目的。除了任何其他内容,您都无法确定传入的字符串是否与JSON字符串中的另一个属性(除了注册)不匹配。