gpt4 book ai didi

mysql - 使用 'concat' 和 'where' 执行 sql 查询很慢

转载 作者:行者123 更新时间:2023-11-29 10:09:53 25 4
gpt4 key购买 nike

我写了一个像这样的sql查询

select max(area_prefix) as called_area, location 
from tabile_1
where '10012451373' like concat(area_prefix,'%')

要从table_1中提取area_prefix,但当我将此查询放在实时服务器上时,此查询太慢,然后需要85.0秒 来获取数据,将 10012451373 作为变量。有没有其他选项可以提高性能。
情况是,我们接到来自世界各地不同地区的电话,因此我们必须取出有关该号码的 area_prefix ,以便我必须看到整个 表中的area_prefix用于告诉号码所属的区域,这是concat关键字发挥作用的地方,但当它放在实时服务器上时,它花费了太多时间。关于区域有不同的表。

CREATE TABLE `tariff_50` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`area_prefix` varchar(255) NOT NULL,
`location` varchar(255) NOT NULL,
`initial_increment` varchar(255) NOT NULL,
`default_increment` varchar(255) NOT NULL,
`rate` varchar(255) NOT NULL,
PRIMARY KEY (`id`,`area_prefix`),
UNIQUE KEY `area_code` (`area_prefix`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=193542 DEFAULT CHARSET=latin1

如何在不使用 CONCAT 关键字的情况下实现此目的。

最佳答案

您遇到的问题是该查询正在执行全表扫描。您在 area_prefix 列上确实有一个索引(因为它是唯一的),但此查询并未使用它。

如果您确实想要性能,则需要彻底更改查询以确保它在搜索时使用 Index Seek 运算符。下面显示的查询避免使用 LIKE 并强制使用 =。它比你拥有的要丑得多,但速度会非常快:

select max(area_prefix) from (
select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 1)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 2)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 3)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 4)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 5)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 6)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 7)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 8)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 9)
union select area_prefix, location from tariff_50 where area_prefix = substring('10012451373', 1, 10)
) x;

我认为area_prefix 的最大长度为10 个字符。如果您有更长的查询,请为此查询添加更多行。

我知道这很丑,但它会很快。 :D

关于mysql - 使用 'concat' 和 'where' 执行 sql 查询很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51187552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com