我正处于一个项目的中间,我需要能够从一个表中获取值(电话号码),然后将其与另一个表中的另一组数字(电话号码率)进行比较,我想知道最有效的方法是什么?
我会使用PHP,然后从中调用SQL,但这是搜索表进行比较的最有效方法
例如,如果我的费率表从最小到最大,反之亦然,它会更快/更慢吗?0 00 000
或
000 00 0
我将如何对其进行编码以使其尽可能快,因为我每次运行此脚本时比较大约60k行
请参阅以下两个表的示例:
Table 1: Phone Numbers
Date, CLID, DNID, Duration
10/3/14, 01344883333, 01344883321, 60
10/3/14, 01344883333, 07839451009, 60
10/3/14, 01344883333, 07767045933, 60
Table 2: Rates
prefix, description, cost
44, UK - Local, 0.005
07760, UK - Mobile - Vodafone, 0.05
07760,UK - Mobile - Vodafone,0.05
07765,UK - Mobile - Vodafone,0.05
07766,UK - Mobile - Vodafone,0.05
077670,UK - Mobile - Vodafone,0.05
077671,UK - Mobile - Vodafone,0.05
077672,UK - Mobile - Vodafone,0.05
077673,UK - Mobile - Vodafone,0.05
077674,UK - Mobile - Vodafone,0.05
077675,UK - Mobile - Vodafone,0.05
077676,UK - Mobile - Vodafone,0.05
077677,UK - Mobile - Vodafone,0.05
077678,UK - Mobile - Vodafone,0.05
077679,UK - Mobile - Vodafone,0.05
07768,UK - Mobile - Vodafone,0.05
答案 0 :(得分:0)
你可以从每次搜索的60K行(我假设你的Rates表中的行数)得到这个,直到最大长度 - 通过一次运行一个查询的任何前缀的最小长度你有这样的答案:
如果任意前缀的最大长度为6个字符,并且您正在搜索电话号码的费率' 07767045933',请搜索以下费率:
SELECT *
FROM Rates r
WHERE r.prefix = LEFT('07767045933', 6)
如果没有结果,则搜索:
SELECT *
FROM Rates r
WHERE r.prefix = LEFT('07767045933', 5)
等,最小前缀大小。
像这样的平等搜索可以使用索引。确保Rates(prefix)
上有索引。
当然,你可以用PHP而不是SQL从电话号码中提取子字符串。使用预准备语句,在找到速率之前切换字符串的开销很小。