两个查询几乎相同,但它们的加载速度甚至都不快

时间:2018-11-27 12:17:17

标签: sql sql-like

我正在开发游戏,并将汽车的车牌号与拥有汽车的用户相关联。

当我执行第一个查询以查找汽车的所有者时,大约需要花费时间。 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秒)

1 个答案:

答案 0 :(得分:1)

您在开始时使用通配符LIKE执行%。这排除了在车辆列上使用任何索引的可能性。如果您在车辆编号的开头删除%,然后在该列中添加索引,则会发现性能得到了极大的改善。当然,这会改变查询的性质,但是从目前的情况来看,您正在对owned_vehicles表执行表扫描,这对于以游戏中的任何规律性执行的查询来说都是不可持续的。

看到上面的注释,您的车辆列实际上是JSON数据。您需要重新考虑存储方式。如果您需要非常快速地查询带有注册号的车辆,则需要将该注册提取到另一列,将其编入索引并通过该列进行过滤。尝试根据JSON字符串的LIKE进行过滤不是RDBMS的目的。除了任何其他内容,您都无法确定传入的字符串是否与JSON字符串中的另一个属性(除了注册)不匹配。