使用“concat”和“where”执行sql查询很慢

7gcisfzg  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(653)

我编写了一个sql查询,如

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

提取 area_prefixtable_1 但这个查询太慢了,当我把这个查询放在实时服务器上时,它就需要 85.0sec 要获取数据,请使用 10012451373 作为一个 variable . 有没有其他选择来提高性能。
现在的情况是,我们接到了来自世界各地的电话,所以我们必须取消 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 关键字。

dddzy1tm

dddzy1tm1#

我得到的答案是:

select max(area_prefix) as called_area,location from tariff_50 
  WHERE area_prefix = substring('10012451373', 1, 1)
  OR  area_prefix = substring('10012451373', 1, 2) 
  OR  area_prefix = substring('10012451373', 1, 3) 
  OR  area_prefix = substring('10012451373', 1, 4) 
  OR area_prefix = substring('10012451373', 1, 5) 
  OR area_prefix = substring('10012451373', 1, 6) 
  OR area_prefix = substring('10012451373', 1, 7) assume `area_prefix` length 7
eqfvzcg8

eqfvzcg82#

您遇到的问题是,此查询正在执行完整表扫描。你的网站上确实有索引 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;

我认为区域前缀的最大长度为10个字符。如果有较长的查询,请在此查询中添加更多行。
我知道它很难看,但它会燃烧得很快d

相关问题