两个几乎相同的查询,但加载速度并不快

Two queries who are almost the same, but they don't load even fast

我正在开发一款游戏,我将汽车的车牌号关联到拥有这辆车的用户。

当我执行第一个查询来查找汽车的所有者时,大约需要。 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,开头带有通配符 %。这排除了在 vehicle 列上使用任何索引。如果您删除车辆编号开头的 %,然后向该列添加索引,您将看到性能得到极大提高。当然,这会改变查询的性质,但就目前情况而言,您正在对 owned_vehicles table 执行 table 扫描,这对于使用任何执行的查询来说是不可持续的游戏的规律性。

看到上面的评论后,您的车辆列实际上是 JSON 数据。您需要重新考虑存储它的方式。如果您需要非常快速地查询具有注册号的车辆,您需要将该注册提取到另一列,对其进行索引并通过该列进行过滤。尝试基于 LIKE 或 JSON 字符串进行过滤并不是 RDBMS 的用途。除此之外,您无法确定您传入的字符串是否与 JSON 字符串中的另一个 属性(注册除外)匹配。