将表中的值与另一组值进行比较的最有效方法

时间:2014-05-19 16:10:34

标签: php mysql sql

我正处于一个项目的中间,我需要能够从一个表中获取值(电话号码),然后将其与另一个表中的另一组数字(电话号码率)进行比较,我想知道最有效的方法是什么?

我会使用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

1 个答案:

答案 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从电话号码中提取子字符串。使用预准备语句,在找到速率之前切换字符串的开销很小。