2017-01-13 8 views
1

が、私はこのクエリを持って説明します。たとえば、この場合、3597(1199x3)のスキャンが実行されるか、1199だけが実行されますか? I「はDDATA、ORDER BY」テーブルに走査線を追加する場合、「PMS_DISPO」なる使用は

1)I節スキャンは、もはや使用する「持たない」の代わりに「WHERE」句を使用する場合1130

2)インデックス。どのように可能ですか?

3)私はPMS_STAGIONI.CSTAGIONI(主キーを表示したい場合)ことを私に示して説明します。

+----+-------------+--------------+-------+---------------+---------------------+---------+------+------+----------+--------------------------------+ 
| 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" の構造は次のとおりです。

CREATE TABLE IF NOT EXISTS `PMS_DISPO` (
    `ID` int(11) NOT NULL AUTO_INCREMENT , 
    `CPRENOTA` int(11) NOT NULL, 
    `DDATA` date NOT NULL, 
    `CCATRIS` int(4) NOT NULL, 
    `NQUANT` int(4) NOT NULL, 
    `CAZIENDA` int(4) NOT NULL, 
    `CAFFILIATO` int(4) NOT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `IDX_DDATA_PMS_DISPO` (`DDATA`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1084 ; 

そして "PMS_STAGIONI" です:

CREATE TABLE IF NOT EXISTS `PMS_STAGIONI` (
    `CSTAGIONE` int(11) NOT NULL, 
    `NVALIDI` tinyint(2) NOT NULL, 
    `BECCEZIONE` tinyint(1) NOT NULL, 
    `AGGSET` varchar(7) DEFAULT NULL, 
    `DINIZVAL` date NOT NULL, 
    `DFINEVAL` date NOT NULL, 
    `CAZIENDA` int(4) NOT NULL, 
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`ID`), 
    KEY `CSTAGIONE` (`CSTAGIONE`), 
    KEY `IDX_INIZFINEVAL_PMS_STAGIONI` (`DINIZVAL`,`DFINEVAL`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; 
+0

両方のテーブルの他のEXPLAINとSHOW CREATE TABLEを見ることができますか? – Strawberry

+0

私は間違っているかもしれませんが、私は実際にこの情報からスキャン回数を決定することはできないと考えています。 – Strawberry

+0

私が実際に正しいことをしているかどうかを判断するための基準は何ですか?インデックスを使用するだけの事実? – sirion1987

答えて

0

この種のクエリが正常に書き込まれます次のように、インデックスを持っているのと同じように...

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 
+0

問題は次のとおりです:もし私が "Join ... On ..."をcstagione(プライマリキー)なしで使用していればOKです... select MySQLでcstagioneを使用するとcstagioneを使用しますが、私はddataを使います!私はどのように解決できますか? – sirion1987

+0

私は分かりません。 – Strawberry

+0

あなたは何も「オン」することができます。 –