使用带有'where'的'concat'的sql查询执行缓慢

时间:2018-07-05 09:14:50

标签: mysql concat

我已经编写了

这样的sql查询
select max(area_prefix) as called_area, location 
  from tabile_1 
  where '10012451373' like concat(area_prefix,'%')

要从area_prefix中提取table_1,但是当我将此查询放在实时服务器上时,此查询的速度太慢,然后需要85.0sec来提取数据,请选择{{ 1}}作为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 关键字来实现这一目标。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是此查询正在执行全表扫描。您确实在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

答案 1 :(得分:0)

这就是我得到的答案:

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