我有大型 mysql 数据库(500 万行),数据是电话号码。我尝试了很多解决方案,但它仍然很慢。现在,我正在使用INT type and LIKE sql query
商店和搜索电话号码。例如:SELECT phonenumber FROM tbl_phone WHERE phonenumber LIKE '%4567'
用于搜索电话号码,例如 170**4567**、249**4567**、...
我需要一个让它运行得更快的解决方案。请帮帮我!
我有大型 mysql 数据库(500 万行),数据是电话号码。我尝试了很多解决方案,但它仍然很慢。现在,我正在使用INT type and LIKE sql query
商店和搜索电话号码。例如:SELECT phonenumber FROM tbl_phone WHERE phonenumber LIKE '%4567'
用于搜索电话号码,例如 170**4567**、249**4567**、...
我需要一个让它运行得更快的解决方案。请帮帮我!
您将数字存储为 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)。例如,这将允许按区域代码进行索引高效查询。
在此处查看建议如何加快 SELECT .. LIKE 在 MySQL 中对多列的查询?
希望能帮助到你!
LIKE 谓词对字符串进行操作,因此您已经进行了从 INT 到 VARCHAR 的隐式转换。这意味着 INT 列上的索引无济于事,即使对于具有前导字符的 LIKE 谓词也是如此。(谓词不可分割。)
如果您正在搜索电话号码的最后一位数字,那么(我所知道的)快速获得类似内容的唯一方法是添加另一个 VARCHAR 列,并将反转的电话号码存储在其中,其中顺序的数字是向后的。
在该 VARCHAR 列上创建一个索引,然后查找以“4567”结尾的电话号码:
WHERE reverse_phone LIKE '7654%'
-或者-
WHERE reverse_phone LIKE CONCAT(REVERSE('4567'),'%')
我会尝试使用REGEXP
,而不是LIKE
像下面的例子:
SELECT `field` WHERE `field` REGEXP '[0-9]';
除此之外,如果您的电话搜索模式部分具有恒定长度,则确实创建一个索引。
这里也是MySQL 模式数学文档的链接。