我已经编写了
这样的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
关键字来实现这一目标。
答案 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