0

我有四个表,我正在尝试加入并将结果输出到一个新表。我的代码如下所示:

create table tbl  
select a.dte, a.permno, (ret - rf) f0_xs_ret, (xs_ret - (betav*xs_mkt)) f0_resid, mkt_cap     last_year_mkt_cap, betav beta_value
from a inner join b using (dte)
inner join c on (year(a.dte) = c.yr and a.permno = c.permno)
inner join  d on (a.permno = d.permno and year(a.dte)-1 = year(d.dte));

所有表都有多个索引,对于 table a(dte, permno)标识一条唯一记录,对于 table bdteid 是唯一记录,对于 table c(yr, permno)id 是唯一记录,对于 table d(dte, permno)id 是唯一记录。select查询部分的解释是:

+----+-------------+-------+--------+-------------------+---------+---------+----------    ------------------------+--------+-------------------+
| id | select_type | table | type   | possible_keys     | key     | key_len | ref                                  | rows   | Extra             |
+----+-------------+-------+--------+-------------------+---------+---------+----------    ------------------------+--------+-------------------+
|  1 | SIMPLE      | d     | ALL    | idx1              | NULL    | NULL    | NULL                                 | 264129 |                   | 
|  1 | SIMPLE      | c     | ref    | idx2              | idx2    | 4       |     achernya.d.permno                |     16 |                   | 
|  1 | SIMPLE      | b     | ALL    | PRIMARY,idx2      | NULL    | NULL    | NULL                                 |  12336 | Using join buffer | 
|  1 | SIMPLE      | a     | eq_ref | PRIMARY,idx1,idx2 | PRIMARY | 7       |    achernya.b.dte,achernya.d.permno |      1 | Using where       | 
+----+-------------+-------+--------+-------------------+---------+---------+----------------------------------+--------+-------------------+

为什么mysql要读取这么多行来处理这个东西?如果我读得正确,它必须读取(264129*16*12336)应该需要一个月的行。

有人可以解释一下这里发生了什么吗?

4

1 回答 1

2

MySQL 必须读取行,因为您使用函数作为连接条件。上的索引dte将无助YEAR(dte)于在查询中解析。如果您想加快速度,请将年份放在自己的列中以用于连接并将索引移动到该列,即使这意味着一些非规范化。

至于索引中您未对其应用函数的其他列,如果索引不会提供太多好处,或者它们不是索引中最左边的列并且您不使用它们,则可能不会使用它们连接条件中该索引的最左边前缀。

有时 MySQL 不使用索引,即使索引可用。发生这种情况的一种情况是优化器估计使用索引将需要 MySQL 访问表中很大比例的行。(在这种情况下,表扫描可能会快得多,因为它需要的搜索次数更少。)

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

于 2012-08-15T04:15:45.500 回答