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

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

我编写了一个sql查询,如

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

提取 area_prefixtable_1 但这个查询太慢了,当我把这个查询放在实时服务器上时,它就需要 85.0sec 要获取数据,请使用 10012451373 作为一个 variable . 有没有其他选择来提高性能。
现在的情况是,我们接到了来自世界各地的电话,所以我们必须取消 area_prefix 关于这个数字,所以我必须看到全部 area_prefix 在表中,要从数字所属的区域中分辨出这是数字所在的区域 concat 关键字已进入帮助,但它需要太多的时间,当它放在一个实时服务器上。关于地区有不同的表格。

  1. CREATE TABLE `tariff_50` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `area_prefix` varchar(255) NOT NULL,
  4. `location` varchar(255) NOT NULL,
  5. `initial_increment` varchar(255) NOT NULL,
  6. `default_increment` varchar(255) NOT NULL,
  7. `rate` varchar(255) NOT NULL,
  8. PRIMARY KEY (`id`,`area_prefix`),
  9. UNIQUE KEY `area_code` (`area_prefix`) USING BTREE
  10. ) ENGINE=InnoDB AUTO_INCREMENT=193542 DEFAULT CHARSET=latin1

如果不使用 CONCAT 关键字。

dddzy1tm

dddzy1tm1#

我得到的答案是:

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

eqfvzcg82#

您遇到的问题是,此查询正在执行完整表扫描。你的网站上确实有索引 area_prefix 列(因为它是唯一的),但此查询未使用它。
如果您真的想要提高性能,那么您需要彻底更改查询,以确保它在搜索时使用index seek操作符。下面显示的查询避免使用 LIKE 强迫使用 = . 它远比你的丑,但它会很快:

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

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

展开查看全部

相关问题