SQL 查询和导入性能优化

2016-08-03 09:35:11 +08:00
 wangpugod2003

请教大家两个问题, mysql 中有两个表:

1 )策略细则表,有三种策略, strategytype 为 1,2 或者 3 ,每种策略的 phonecode 等参数类型不一样: CREATE TABLE iptv_ipandphonecode ( codeid int(11) NOT NULL, regionname char(255) NOT NULL, areaname char(255) NOT NULL, strategytype int NOT NULL, codetype int NOT NULL, phonecode char(255) default '' NULL,/format : YYYY.MM.DD HH24:MI:SS/ startcode char(255) default '' NULL,/format : YYYY.MM.DD HH24:MI:SS/ endcode char(255) default '' NULL, upgradeflag int NOT NULL, remark char(255) default '' NULL, reserve1 int(11) default NULL, reserve2 char(255) default NULL, PRIMARY KEY (codeid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

策略表,用来存储当前是否配置了升级策略: CREATE TABLE iptv_strategyrelation ( strategyid int(11) NOT NULL, codeid int(11) NOT NULL, remark char(255) default NULL, reserve1 int(11) default NULL, reserve2 char(255) default NULL, PRIMARY KEY (strategyid,codeid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

每次当有一个升级请求过来时候,都需要执行如下三个 SQL 查询语句,分别用来判断上报的参数是否在 iptv_ipandphonecode 表中存在,如果存在就认为符合策略,否则认为不符合策略:

select sb.codeid,sb.regionname,sb.strategytype,sb.codetype,sb.phonecode,sb.startcode,sb.endcode,sb.upgradeflag,sb.remark from iptv_ipandphonecode sb, iptv_strategyrelation sb2 where sb.codeid=sb2.codeid and sb.strategytype=3 and sb2.strategyid=?

select sb.codeid,sb.regionname,sb.strategytype,sb.codetype,sb.phonecode,sb.startcode,sb.endcode,sb.upgradeflag,sb.remark from iptv_ipandphonecode sb, iptv_strategyrelation sb2 where sb.codeid=sb2.codeid and sb.strategytype=2 and sb2.strategyid=?

select sb.codeid,sb.regionname,sb.strategytype,sb.codetype,sb.phonecode,sb.startcode,sb.endcode,sb.upgradeflag,sb.remark from iptv_ipandphonecode sb, iptv_strategyrelation sb2 where sb.codetype=3 and sb.codeid=sb2.codeid and sb.strategytype=1 and sb2.strategyid=?

在表 iptv_ipandphonecode 中的数据有十万条的时候,表 2 的对应条数也很多,导致上面的 SQL 级联查询很慢,请问有优化的方法吗?是否能把上面的三种查询方式统一起来?或者别的办法?

  1. 另外,策略条数很多的时候,数据导入的时候也很慢,导入数据时,首先我是查询该条策略是否存在: select * from iptv_ipandphonecode where phonecode=? 然后再插入两张表: insert into iptv_ipandphonecode(codeid,regionname,areaname,strategytype," "codetype,phonecode,startcode,endcode,upgradeflag,remark)values(?,?,?,?,?,?,?,?,?,?)

然后再导入第二张策略表: insert into iptv_strategyrelation(strategyid,codeid)values(?,?)

这个导入有没优化的办法,谢谢!

2671 次点击
所在节点    MySQL
2 条回复
liprais
2016-08-03 09:58:21 +08:00
导入用 load file in path ,比一条条插入快
klaksvik
2017-11-07 14:54:52 +08:00
@wangpugod2003 兄,PTE 考试 7 炸有经验么? OZing

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296726

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX