通过索引加速Mysql

时间:2016-11-08 00:30:32

标签: mysql

我一直在查询一个包含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 
  1. 我已经取代了&#34;内部联接&#34;用&#34; straight_join&#34;。更糟糕的是。 Mysql已经优化了查询。
  2. 列中有空值。我不能给它一个值,因为空值意味着缺少值,这意味着公司当时不提供相应的值。
  3. 我已经厌倦了为所有&#34;选择的变量创建一个索引&#34;从tableB运行查询。它非常快。
  4. 在tableB上创建索引my_id1(fpeDate,fileDate,stockID,endDate,Var1,Var2,Var3);

    如果我创建如下所示的索引,则查询时间会变得很长。

    create index my_id1 on tableB (fpeDate, fileDate, stockID);
    

    现在出现问题:

    1. 我无法索引tableB中有数百列的所有列。

    2. 我需要的列总是不同的。例如,早期的情况,我需要Var1,Var2和Var3。在另一种情况下,我可能需要加载Var5,Var8和Var10。

    3. 感谢您的建议 →

1 个答案:

答案 0 :(得分:0)

它需要两种方式 1)按查询顺序索引

2)需要索引所有选定的变量