2

選択クエリを作成しようとしていますが、説明クエリを使用する場合、mysql は常に「ファイルソートの使用」を追加で使用します。

最も単純なクエリを試してみましたが、問題は解決しません。私のテーブル「Partidas」の構造は次のとおりです。

CREATE TABLE IF NOT EXISTS `Partidas` (
  `IdUsuario` int(11) NOT NULL,
  `IdPartida` int(11) NOT NULL,
  `TipoPartida` tinyint(4) NOT NULL,
  `Facil` tinyint(1) NOT NULL DEFAULT '0',
  `Normal` tinyint(1) NOT NULL DEFAULT '0',
  `Dificil` tinyint(1) NOT NULL DEFAULT '0',
  `FchPartida` date NOT NULL,
  `PuntosPartida` mediumint(9) NOT NULL,
  `IdPartidaTemp` bigint(20) NOT NULL,
  `ComplPers` tinyint(1) NOT NULL,
  `SoloMulti` tinyint(2) NOT NULL,
  PRIMARY KEY (`IdUsuario`,`IdPartida`),
  KEY `IX_PARTIDAS_RECORDS` (`TipoPartida`,`FchPartida`,`PuntosPartida`),
  KEY `IX_PARTIDAS_ORDEN2` (`FchPartida`),
  KEY `IX_PARTIDAS_COMPLPERS` (`ComplPers`,`FchPartida`,`PuntosPartida`),
  KEY `IX_PARTIDAS_SOLOMULTI` (`SoloMulti`,`FchPartida`,`PuntosPartida`),
  KEY `IX_PARTIDAS_DIFICULTAD` (`Facil`,`Normal`,`Dificil`,`SoloMulti`,`FchPartida`,`PuntosPartida`),
  KEY `IX_PARTIDAS_COMPMULTI` (`ComplPers`,`SoloMulti`,`FchPartida`,`PuntosPartida`),
  KEY `IX_PARTIDAS_COMPLPERS_SIMPLE` (`ComplPers`,`PuntosPartida`),
  KEY `IX_PARTIDAS_SOLOMULTI_SIMPLE` (`SoloMulti`,`PuntosPartida`),
  KEY `IX_PARTIDAS_FECHA` (`FchPartida`),
  KEY `IX_PARTIDAS_PUNTOS` (`PuntosPartida`),
  KEY `PRUEBA_PARTIDAS` (`PuntosPartida`,`TipoPartida`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

テーブルには約 1000 ~ 5000 行 (非常に少ないデータ) がありますが、常にファイルソートを使用します。テストに使用しているクエリは次のとおりです。

explain select *
from Partidas
order by PuntosPartida
limit 0, 50;

結果は次のとおりです。

| id | select_type | table              | type  | possible_keys | key       | key_len | ref  | rows | Extra          |
|  1 | SIMPLE      | Partidas           | ALL   | NULL          | NULL      | NULL    |NULL  | 1041 | Using filesort |

ただし、クエリで制限を変更した場合、たとえば制限0,5; 結果も変わる

| id | select_type | table              | type  | possible_keys | key                | key_len | ref  | rows | Extra       |
|  1 | SIMPLE      | Partidas           | index | NULL          | IX_PARTIDAS_PUNTOS | 3       |NULL  |  5   |             |

mysql 構成では、buffer と sort の変数は次のとおりです。

-myisam sort buffer size: 2MB
-sort buffer size: 2MB
-key buffer size: 1GB

しかし、これらの値を変更しようとしましたが (8MB まで増やしました)、結果は同じです

ご協力ありがとう御座います

4

1 に答える 1

0

私の推測では、これはクエリ オプティマイザーがその仕事をしているということです。この記事は、「オプティマイザーは完全なテーブル スキャンを優先し、インデックスのスキャンを関連する選択肢として考慮しませんでした (possible_keys: NULL)」ことを示しています。

強制的にインデックスを使用することはできますが、実行時間が遅くなる可能性があります (記事にも記載されています)。

select *
from Partidas FORCE INDEX(IX_PARTIDAS_PUNTOS)
order by PuntosPartida
limit 0, 50; 

また、テーブル スキャンを回避する方法 (「filesort を使用する」)の詳細については、こちらを参照してください。

于 2013-03-11T13:59:15.257 に答える