我有大型mysql数据库(500万行),数据是电话号码。
我尝试了很多解决方案,但它仍然很慢。现在,我正在使用INT type and LIKE sql query
存储和搜索电话号码。
例如:SELECT phonenumber FROM tbl_phone WHERE phonenumber LIKE '%4567'
搜索电话号码,如170 ** 4567 **,249 ** 4567 **,......
我需要一个让它运行得更快的解决方案。请帮帮我!
答案 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)
答案 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'),'%')