2

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

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

4

4 回答 4

1

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

-- 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)。例如,这将允许按区域代码进行索引高效查询。

于 2012-08-09T17:00:41.667 回答
0

在此处查看建议如何加快 SELECT .. LIKE 在 MySQL 中对多列的查询?

希望能帮助到你!

于 2012-08-09T16:35:05.227 回答
0

LIKE 谓词对字符串进行操作,因此您已经进行了从 INT 到 VARCHAR 的隐式转换。这意味着 INT 列上的索引无济于事,即使对于具有前导字符的 LIKE 谓词也是如此。(谓词不可分割。)

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

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

WHERE reverse_phone LIKE '7654%'

-或者-

WHERE reverse_phone LIKE CONCAT(REVERSE('4567'),'%')
于 2012-08-09T16:43:05.483 回答
0

我会尝试使用REGEXP,而不是LIKE像下面的例子:

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

除此之外,如果您的电话搜索模式部分具有恒定长度,则确实创建一个索引。

这里也是MySQL 模式数学文档的链接。

于 2012-08-09T16:37:07.333 回答