我创建了一个mysql表,其中包含犯罪计数,犯罪描述,犯罪类别和犯罪地址。我在这张桌子上创建了一些报告。用户希望在报告中按地址过滤器进行搜索。所以我们将在桌子上使用where子句并且在街道上有条件。
问题是街道地址是一个非常大的字符串,并且当表格已经很大时搜索/过滤表格会花费很多时间。我尝试使用像md5(streetaddress)这样的哈希,但这也没有帮助。这种where子句
使查询变得非常慢例如
select * from crimedata where streetaddress = "41 BENNETT RD Watertown Massachusetts United States"
在这种情况下索引街道地址是否有帮助,还是应该使用某种散列方法在表格中更快地进行这种字符串搜索?
沙
答案 0 :(得分:0)
在streetaddress上添加索引会有所帮助但有限。
您可能需要考虑将存储引擎更改为支持全文搜索的内容。 一个例子是Mroonga
注意:我与Mroonga无关。我之前有机会使用该库,发现它确实提供了文本搜索的改进。
答案 1 :(得分:0)
您可以尝试正确地规范化数据,其中地址存储在一个表中,而ID在另一个表中引用。
您的查询应该如何?:
SELECT ... FROM crimedata WHERE address_id=?
其中?
是占位符,表示您从另一个表中获取的地址的ID。
与往常一样,在WHERE
条款中反复出现的任何条件都是被索引的强大候选者。
答案 2 :(得分:0)
我会退后一步,看看你是否以一种可扩展的方式攻击问题。
我会考虑使用地理空间信息进行查询,然后使用街道地址作为输出显示参数。
如果您使用GIS对象存储像点这样的东西,那么您将来可以进行半径搜索和边界框查询。
当有人进入街道地址转换为纬度/经度或点数时,您的编码会发生变化。然后在进行搜索时,它会更快,因为您不会进行全文搜索。 它将使您能够调用映射API以显示公共映射服务上的地址或位置。
http://mysqlserverteam.com/mysql-5-7-and-gis-an-example/
[是的,当然将这样的东西扩展到全球范围将把数据库领域带入bigdata世界]