1

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

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

例子

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

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

沙阿

4

3 回答 3

0

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

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

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

于 2014-10-14T18:29:01.463 回答
0

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

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

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

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

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

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

于 2014-10-14T18:52:00.210 回答
0

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

您的查询应如下所示?:

SELECT ... FROM crimedata WHERE address_id=?

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

与往常一样,在WHERE子句中作为条件重复出现的任何内容都是被索引的有力候选者。

于 2014-10-14T18:45:11.407 回答