【问题标题】:mysql where clause on long strings makes the query too slow长字符串上的 mysql where 子句使查询太慢
【发布时间】:2014-10-14 18:24:15
【问题描述】:

我创建了一个 mysql 表,其中包含犯罪计数、犯罪描述、犯罪类别和犯罪地址。我已经在这张表上创建了一些报告。用户希望在报告中按地址过滤器进行搜索。所以我们将在 table 上使用 where 子句,并在 street 上设置条件。

问题是街道地址是一个很大的字符串,当表格已经很大时,通过地址搜索/过滤表格将花费大量时间。我尝试使用像 md5(streetaddress) 这样的散列,但这也无济于事。使用这种 where 子句,查询变得非常慢

例子

select * from crimedata where streetaddress = "41 BENNETT RD Watertown  Massachusetts United States"

在这种情况下,索引 streetaddress 会有所帮助,还是我应该使用某种散列来使这种字符串在表中搜索得更快?

沙赫

【问题讨论】:

  • 是的,索引肯定会有所作为
  • 你说这样的查询“会花费很多时间”。他们会花费很多时间,还是您只是假设他们会? MySQL 非常擅长这种查找。散列不值得麻烦,而索引是。您真正的问题将是这种WHERE 子句所需的完全匹配。您可以考虑 FULLTEXT 搜索,您可以阅读相关内容。

标签: mysql string-hashing


【解决方案1】:

在 streetaddress 上添加索引会有所帮助,但有限。

您可能需要考虑将存储引擎更改为支持全文搜索的引擎。 一个例子是Mroonga

注意:我与 Mroonga 无关。我之前有机会使用该库,发现它确实在文本搜索方面提供了改进。

【讨论】:

  • InnoDB 和 MyISAM 在 MySQL 5.6 中都支持全文索引,尽管在任何关键的事情上使用 MyISAM 可能是一个非常糟糕的主意。
【解决方案2】:

您可以尝试正确规范化您的数据,其中地址存储在一个表中,并由另一个表中的 ID 引用。

您的查询应该是这样的?:

SELECT ... FROM crimedata WHERE address_id=?

? 是您从另一个表中获取的地址 ID 的占位符。

与往常一样,在WHERE 子句中作为条件重复出现的任何内容都非常适合被索引。

【讨论】:

    【解决方案3】:

    我会退后一步,看看您是否正在以一种可以扩展的方式解决问题。

    我会考虑使用地理空间信息进行查询,然后使用街道地址作为输出显示参数。

    如果您使用 GIS 对象来存储点之类的内容,那么您将来可以进行半径搜索和边界框查询。

    当有人输入街道地址以转换为纬度/经度或点时,您的编码会发生变化。然后在进行搜索时它会更快,因为您不会进行全文搜索。 它将使您能够调用地图 API 以在公共地图服务上显示地址或地点。

    http://mysqlserverteam.com/mysql-5-7-and-gis-an-example/

    [是的,当然,将这样的东西扩展到全球范围会脱离数据库领域进入大数据世界]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多