我正在开发一个游戏,我将一辆车的车牌号与拥有这辆车的用户联系起来。
当我执行第一个查询以找到车主时,大约需要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秒(
您正在执行一个开头带有通配符%
的LIKE
。这就排除了在车辆立柱上使用任何索引的可能性。如果您删除车辆编号开头的%
,然后在该列中添加索引,您将看到性能大大提高。当然,这会改变查询的性质,但就目前情况来看,您正在对owned_vehicles
表执行表扫描,这对于在游戏中有规律执行的查询来说是不可持续的。
看到上面的评论后,您的车辆列实际上是JSON数据。你需要重新思考你储存这些东西的方式。如果您需要快速查询具有注册号的车辆,则需要将该注册提取到另一列,对其进行索引并通过该列进行筛选。RDBMS不适合尝试基于JSON字符串的LIKE
进行筛选。除此之外,您无法确定传入的字符串是否与JSON字符串中的另一个属性(注册除外(匹配。