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