我一直在查询一个包含700万行和数百列的表,并在MySQL中通过以下查询在20秒内返回结果
SELECT r.wgt, r.yyyymm, s.fpeDate, s.fileDate, s.stockID, s.endDate, s.Var1, s.Var2, s.Var3
FROM tableA AS r
INNER JOIN tableB AS s ON s.fpeDate >= 201212 AND s.fpeDate <= 201412 AND s.fileDate <20141201 AND s.stockID = r.stockID AND r.yyyymm = 201412;
然而,当我使用相同的查询向表中提供100万行时,我得到的结果大约为60秒。我有另外20百万行要追加它。
我为tableB创建了3个列fpeDate,fileDate,stockID的索引,使它们唯一,以便在追加过程中忽略任何重叠数据。
ALTER TABLE tableA
ADD CONSTRAINT uniqueKeys unique INDEX (yyyymm, stockID);
ALTER TABLE tableB
ADD CONSTRAINT uniqueKeys unique INDEX (fpeDate, fileDate, stockID);
当我使用EXPLAIN时,它正在扫描所有行。你有什么想法让我更快吗?
我使用了EXPLAIN
ID select_type table partitions type possible keys key ref rows filtered ext
1 SIMPLE s null ALL uniqueKeys null null null 7132508 17.21 Using where
1 SIMPLE r null ref uniqueKeys uniqueKeys 38 const,r.stockid 1 100.00
在tableB上创建索引my_id1(fpeDate,fileDate,stockID,endDate,Var1,Var2,Var3);
如果我创建如下所示的索引,则查询时间会变得很长。
create index my_id1 on tableB (fpeDate, fileDate, stockID);
现在出现问题:
我无法索引tableB中有数百列的所有列。
我需要的列总是不同的。例如,早期的情况,我需要Var1,Var2和Var3。在另一种情况下,我可能需要加载Var5,Var8和Var10。
感谢您的建议 →
答案 0 :(得分:0)
它需要两种方式 1)按查询顺序索引
2)需要索引所有选定的变量