Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将地址存储为散列_Mysql_Postgresql_Hash_Geolocation - Fatal编程技术网

Mysql 将地址存储为散列

Mysql 将地址存储为散列,mysql,postgresql,hash,geolocation,Mysql,Postgresql,Hash,Geolocation,我有大约一百万个地址,还会有更多。对于每个地址,我需要知道位置纬度,经度 某些地址可能重复。例如,两张唱片:美国、纽约、时代广场和美国纽约时代广场。我将这些地址规范化为美国纽约时代广场,并将它们存储在表缓存的_地址中,以便以后当我需要知道地址的纬度/经度时,我可以查询此表 主要问题是:我是否可以存储md5/sha1/sha256散列来提高性能/优化存储 有问题的查询是:从缓存的_地址中选择lat,lng,其中地址=?,参数?相当于美国纽约时代广场。这里的地址表示规范化的地址字符串 对于哈希,它将

我有大约一百万个地址,还会有更多。对于每个地址,我需要知道位置纬度,经度

某些地址可能重复。例如,两张唱片:美国、纽约、时代广场和美国纽约时代广场。我将这些地址规范化为美国纽约时代广场,并将它们存储在表缓存的_地址中,以便以后当我需要知道地址的纬度/经度时,我可以查询此表

主要问题是:我是否可以存储md5/sha1/sha256散列来提高性能/优化存储

有问题的查询是:从缓存的_地址中选择lat,lng,其中地址=?,参数?相当于美国纽约时代广场。这里的地址表示规范化的地址字符串

对于哈希,它将是:从缓存的_地址中选择lat,lng,其中地址=?,参数?等于散列函数“美国纽约时代广场”。这里address表示规范化地址字符串的散列


我使用postgresql,但是如果mysql能够提供一些性能/存储优化,那么也可以使用mysql。

就mysql而言,如果您散列值并以有效的方式存储它们,您可以期望性能得到提高。我很确定这也适用于postgress,因为这是DBA和开发人员面临的常见问题

在列地址中存储完整的规范化地址时,每个记录至少需要N个字节,其中N是地址中的字符数。以你为例,是25。但是,当角色集开始发挥作用时,事情变得复杂起来,您可能需要比N多得多,utf8可能需要4*N。然后需要根据m*N索引更多的存储空间,DB引擎需要使用排序规则等执行字符串比较

另一方面,当使用SHA-256对地址进行散列时,无论地址有多长,都只需存储32个字节。此外,您还可以将字节存储在BINARY32列固定存储中,用于数据和索引,并在查询时执行二进制比较

示例:

ALTER TABLE t ADD列地址\哈希二进制32; 更新t SET address_hash=unhexsha2address,256; 从t中选择c1,c2,其中地址_散列=?; - ? 将是地址的SHA-256哈希 更多关于这方面的信息,请访问


如果性能/存储是最重要的因素,并且您的应用程序可以容忍一些冲突,那么您甚至可以使用MD5。这将需要一半的字节,但您将需要处理两个不同地址之间可能产生的冲突,从而生成相同的哈希。

就MySQL而言,如果您对值进行哈希处理并以高效的方式存储它们,您可以期待性能的提高。我很确定这也适用于postgress,因为这是DBA和开发人员面临的常见问题

在列地址中存储完整的规范化地址时,每个记录至少需要N个字节,其中N是地址中的字符数。以你为例,是25。但是,当角色集开始发挥作用时,事情变得复杂起来,您可能需要比N多得多,utf8可能需要4*N。然后需要根据m*N索引更多的存储空间,DB引擎需要使用排序规则等执行字符串比较

另一方面,当使用SHA-256对地址进行散列时,无论地址有多长,都只需存储32个字节。此外,您还可以将字节存储在BINARY32列固定存储中,用于数据和索引,并在查询时执行二进制比较

示例:

ALTER TABLE t ADD列地址\哈希二进制32; 更新t SET address_hash=unhexsha2address,256; 从t中选择c1,c2,其中地址_散列=?; - ? 将是地址的SHA-256哈希 更多关于这方面的信息,请访问


如果性能/存储是最重要的因素,并且您的应用程序可以容忍一些冲突,那么您甚至可以使用MD5。这将需要一半的字节,但您需要处理两个不同地址之间可能发生的冲突,从而生成相同的哈希。

您似乎已经知道可以存储地址字段的哈希以及如何查询它。你的问题是我是否可以或者我是否应该…优化查询?你可以吗?一种方法是:对其进行基准测试。另一方面,将解析后的地址作为文本保存在多个字段中可能很有用,这样对标准化器的任何更改都可以应用到地址缓存中。地址更改、街道名称更改、城市合并、邮政编码更改等情况也是如此。您似乎已经知道可以存储地址字段的哈希值以及如何查询它。你的问题是我是否可以或者我是否应该…优化查询?你可以吗?一种方法是:对其进行基准测试。另一方面,将解析后的地址作为文本保存在多个字段中可能很有用,这样对标准化器的任何更改都可以应用到地址缓存中。addr也是如此 ess变更街道名称变更、城市合并、邮政编码变更等