数字类型的大型mysql表的快速搜索解决方案?

时间:2012-08-09 16:30:51

标签: mysql phone-number

我有大型mysql数据库(500万行),数据是电话号码。 我尝试了很多解决方案,但它仍然很慢。现在,我正在使用INT type and LIKE sql query存储和搜索电话号码。 例如:SELECT phonenumber FROM tbl_phone WHERE phonenumber LIKE '%4567' 搜索电话号码,如170 ** 4567 **,249 ** 4567 **,......

我需要一个让它运行得更快的解决方案。请帮帮我!

4 个答案:

答案 0 :(得分:1)

您将数字存储为INT,但查询为CHAR(LIKE运算符隐式将INT转换为CHAR),它肯定不是最佳的。如果你想将数字保持为INT(可能是IO性能方面的最佳想法),你最好更改你的查询以使用数字比较:

-- instead of CHAR operators 
WHERE phone_number LIKE '%4567'
WHERE phone_number LIKE '1234%'
-- use NUMERIC operators
WHERE phone_number % 10000 = 4567
WHERE phone_number >= 12340000 -- considering 8 digit numbers

除了选择存储和查询数据的同类方法之外,您还应该记住创建适当的索引CREATE INDEX IDX0 ON table (phone_number);

不幸的是,即便如此,您的查询可能也不是最佳的,因为类似于@ron所评论的效果。在这种情况下,您可能需要调整表以将此列拆分为更易于管理的列(例如national_code,area_code和phone_number)。例如,这将允许按区域代码进行索引有效查询。

答案 1 :(得分:0)

在此处查看建议How to speed up SELECT .. LIKE queries in MySQL on multiple columns?

希望它有所帮助!

答案 2 :(得分:0)

我会尝试使用REGEXP,而不是LIKE,如下例所示:

SELECT `field` WHERE `field` REGEXP '[0-9]';

除此之外,实际上,如果手机搜索模式的一部分具有恒定长度,则创建索引。

这里还有MySQL pattern mathching文档的链接。

答案 3 :(得分:0)

LIKE谓词是在一个字符串上运行的,所以你有一个从INT到VARCHAR的隐式转换。这意味着INT列上的索引不会有帮助,即使对于具有前导字符的LIKE谓词也是如此。 (谓词不可思议。)

如果您正在搜索电话号码的最后位数,那么(我知道)获得 fast 之类的东西的唯一方法就是添加另一个VARCHAR列,并将反转的电话号码存储在其中,其中数字的顺序是向后的。

在该VARCHAR列上创建索引,然后查找以' 4567'结尾的电话号码:

WHERE reverse_phone LIKE '7654%'

-OR -

WHERE reverse_phone LIKE CONCAT(REVERSE('4567'),'%')