代码之家  ›  专栏  ›  技术社区  ›  erotsppa

与电话号码的MySQL数据库搏斗

  •  5
  • erotsppa  · 技术社区  · 14 年前

    国际电话号码 在mysql数据库中。然后应用程序需要查询数据库并搜索特定的数字。听起来很简单,但实际上是个大问题。

    因为用户可以用不同的格式搜索这个数字,所以我们每次都要对数据库进行一次完整的扫描。

    例如。我们可能在数据库中存储了17162225555号(还有另外500万个条目)。现在用户出现并尝试使用7162225555进行搜索。另一个用户可能会尝试使用2225555进行搜索。因此,换句话说,数据库必须使用“like%number%”发出SQL查询,这将导致完全扫描。

    我们应该如何设计这个应用程序?有什么方法可以让Mysql更好地处理这个问题吗?或者我们应该不使用SQL吗?

    另外,我们有数百万个条目,每秒有10个这样的搜索请求。

    1 回复  |  直到 14 年前
        1
  •  8
  •   Steve Weet    14 年前

    这很奇怪,在过去的15年里,我自己也曾多次与这个问题作过斗争,通常会提出将区号、国家代码和数字分隔成不同字段等的结构。但在阅读你的问题时,另一个解决方案突然出现在我的脑海中,它确实需要一个单独的字段,尽管这样可能不适合您。

    您可以有一个单独的字段,名为reverse\u phone\u number,由数据库引擎自动填充,然后当人们搜索时,只需反转搜索字符串,并使用索引的反向字段,在类似字符串的末尾只有一个%即可,从而允许使用索引。

    根据数据库引擎的不同,您可以基于用户定义的函数创建索引,该函数为您执行相反的操作,从而避免了对附加字段的需要。

    在某些国家,例如英国,您可能会遇到前导零的问题。英国电话号码用(区号)(电话号码)表示,例如01634 511098,当该号码国际化时,将删除区号的前导零,并添加国际拨号代码(+或00)和国家代码(44)。这导致国际电话号码为+441634511098。任何搜索0163451109的用户如果是以国际化格式输入的,将找不到该电话号码。您可以通过从搜索字符串中删除前导零来克服这个问题。

    编辑