MySQL解释的使用

MySQL解释的使用,mysql,query-optimization,explain,Mysql,Query Optimization,Explain,我有一个疑问: EXPLAIN EXTENDED SELECT DISTINCT PMS_STAGIONI.DINIZVAL, PMS_STAGIONI.DFINEVAL, PMS_DISPO.DDATA FROM PMS_DISPO JOIN PMS_STAGIONI HAVING PMS_DISPO.DDATA BETWEEN PMS_STAGIONI.DINIZVAL AND PMS_STAGIONI.DFINEVAL explain的输出是: +----+------

我有一个疑问:

EXPLAIN EXTENDED
SELECT DISTINCT 
 PMS_STAGIONI.DINIZVAL,
 PMS_STAGIONI.DFINEVAL,
 PMS_DISPO.DDATA
FROM 
  PMS_DISPO JOIN PMS_STAGIONI
HAVING
  PMS_DISPO.DDATA BETWEEN PMS_STAGIONI.DINIZVAL AND PMS_STAGIONI.DFINEVAL
explain的输出是:

+----+-------------+--------------+-------+---------------+------------------------------+---------+------+------+----------+--------------------------------+
| id | select_type | table        | type  | possible_keys | key                          | key_len | ref  | rows | filtered | Extra                          |
+----+-------------+--------------+-------+---------------+------------------------------+---------+------+------+----------+--------------------------------+
|  1 | SIMPLE      | PMS_STAGIONI | index | NULL          | IDX_INIZFINEVAL_PMS_STAGIONI | 6       | NULL |    3 |   100.00 | Using index; Using temporary   |
|  1 | SIMPLE      | PMS_DISPO    | index | NULL          | IDX_DDATA_PMS_DISPO          | 3       | NULL | 1199 |   100.00 | Using index; Using join buffer |
+----+-------------+--------------+-------+---------------+------------------------------+---------+------+------+----------+--------------------------------+
我的问题是如何使用explain计算连接的乘积。例如,在这种情况下,是执行3597(1199x3)扫描还是仅执行1199

1) 如果我在“PMS_DISPO”表中添加“ORDER BY DDATA”,扫描的行将变为1130

2) 如果我使用“WHERE”子句而不是“HAVING”子句,scan将不再使用索引。怎么可能呢

3) 如果我想显示PMS_STAGIONI.cstagoni(主键),请说明以下内容:

+----+-------------+--------------+-------+---------------+---------------------+---------+------+------+----------+--------------------------------+
| id | select_type | table        | type  | possible_keys | key                 | key_len | ref  | rows | filtered | Extra                          |
+----+-------------+--------------+-------+---------------+---------------------+---------+------+------+----------+--------------------------------+
|  1 | SIMPLE      | PMS_STAGIONI | ALL   | NULL          | NULL                | NULL    | NULL |    3 |   100.00 | Using temporary                |
|  1 | SIMPLE      | PMS_DISPO    | index | NULL          | IDX_DDATA_PMS_DISPO | 3       | NULL | 1130 |   100.00 | Using index; Using join buffer |
+----+-------------+--------------+-------+---------------+---------------------+---------+------+------+----------+--------------------------------+ 
如何强制使用其他索引

提前谢谢


编辑:

“PMS_DISPO”的结构是:

“PMS_STAGIONI”是:


这种类型的查询通常按如下方式编写,索引与您拥有的索引相同

SELECT DISTINCT s.dinizval
              , s.dfineval
              , d.ddata
           FROM pms_dispo d
           JOIN pms_stagioni s
             ON d.ddata BETWEEN s.dinizval AND s.dfineval

这种类型的查询通常按如下方式编写,索引与您拥有的索引相同

SELECT DISTINCT s.dinizval
              , s.dfineval
              , d.ddata
           FROM pms_dispo d
           JOIN pms_stagioni s
             ON d.ddata BETWEEN s.dinizval AND s.dfineval

我们是否可以看到另一个解释,并为两个表显示CREATE TABLE。我可能弄错了,但实际上我认为不可能根据这些信息确定扫描的数量。确定我是否真的做了正确的事情的标准是什么?仅仅是使用索引的事实?这是一个“交叉连接”!您将从每个表中获取所有行的所有组合。只有这样,它才会过滤掉一些(通过
拥有
)。哦。但是它不能有很大的改进
其中y.start和y.end之间的x.a不能进行太多优化。我们能否看到另一个解释,并为两个表显示CREATE TABLE。我可能弄错了,但实际上我不认为可以根据此信息确定扫描次数。确定我是否真的做了正确的事情的标准是什么?仅仅是使用索引的事实?这是一个“交叉连接”!您将从每个表中获取所有行的所有组合。只有这样,它才会过滤掉一些(通过
拥有
)。哦。但是它不能有很大的改进
其中y.start和y.end之间的x.a不能进行太多优化。问题是:如果我使用“Join…On…”而不使用cstagione(主键)是可以的。。。如果我在select MySQL中使用cstagione,请使用cstagione进行连接,但我希望使用ddata!我如何解决?我不明白。你可以对任何事情进行
。如果我使用此查询,我会得到以下结果:1 |简单| d |所有| IDX | DDATA | PMS | DISPO | NULL | NULL | 1069 | 100.00 |检查每个记录的范围(索引映射:0x2)。问题是:如果我使用“Join…ON…”没有cstagione(主键)是可以的。。。如果我在select MySQL中使用cstagione,请使用cstagione进行连接,但我希望使用ddata!我如何解决?我不明白。你可以对任何事情进行
。如果我使用此查询,我会得到以下结果:1 |简单| d |所有| IDX | DDATA | PMS | DISPO | NULL | NULL | 1069 | 100.00 |检查每个记录的范围(索引映射:0x2)
SELECT DISTINCT s.dinizval
              , s.dfineval
              , d.ddata
           FROM pms_dispo d
           JOIN pms_stagioni s
             ON d.ddata BETWEEN s.dinizval AND s.dfineval