1

私はこれらのテーブルを持っています:

CREATE TABLE  `cstat` (
  `id_cstat` bigint(20) NOT NULL,
  `lang_code` varchar(3) NOT NULL,
  `description` varchar(255) NOT NULL,
  `description_tr` varchar(255) NOT NULL,
  `id_ccountry` varchar(3) NOT NULL,
  `geometry_point` point DEFAULT NULL,
  `geometry_poly` polygon DEFAULT NULL,
  `name_type` varchar(1) NOT NULL,
  `bb_min_lat` double DEFAULT NULL,
  `bb_min_lon` double DEFAULT NULL,
  `bb_max_lat` double DEFAULT NULL,
  `bb_max_lon` double DEFAULT NULL,
  `has_ex` tinyint(1) NOT NULL DEFAULT '0',
  `order` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_cstat`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE  `dstat` (
  `id_cstat` bigint(20) NOT NULL,
  `lang_code` varchar(3) NOT NULL,
  `word` varchar(30) NOT NULL,
  `word_no` tinyint(3) unsigned NOT NULL,
  `word_cnt` tinyint(3) unsigned NOT NULL,
  `word_grp` tinyint(3) unsigned NOT NULL,
  `name_type` char(1) CHARACTER SET ascii NOT NULL,
  `cstat_order` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

dstat の条件を使用して、cstat.order または dstat.cstat_order の順序で cstat からレコードを選択する必要があります。

私のクエリは次のようになります。

SELECT cstat.ID_CSTAT, cstat.LANG_CODE, cstat.DESCRIPTION, cstat.DESCRIPTION_TR, cstat.ID_CCOUNTRY, AsBinary(cstat.GEOMETRY_POINT) AS GEOMETRY_POINT, cstat.NAME_TYPE, cstat.BB_MIN_LAT, cstat.BB_MIN_LON, cstat.BB_MAX_LAT, cstat.BB_MAX_LON, cstat.HAS_EX
FROM cstat cstat
JOIN dstat W0
ON (W0.ID_CSTAT = cstat.ID_CSTAT)
where
  (W0.WORD = 'ceska') AND
  (W0.NAME_TYPE = 'B')
ORDER BY W0.CSTAT_ORDER;

ファイルソートの使用を防ぐために作成するインデックスを誰か助けてもらえますか? 私はほとんどすべてを試したと思いますが、失敗しました。この基本クエリにはさらに変更があります (テーブル dstat の別の 1 つまたは複数の結合ですが、現時点では重要ではありません)。

どうもありがとうございました。

編集:正直に言うと、私は多くのインデックスを試しました。私が宣言したベースは、cstat_id_cstat の主キーです。現時点では、次のインデックスがあります。

KEY `ix_dstat_nt_word_id_order` (`name_type`,`word`,`id_cstat`,`cstat_order`);
KEY `ix_dstat_word_id_order` (`word`,`id_cstat`,`cstat_order`);
KEY `ix_dstat_nt_grp_no_word_id_order` (`name_type`,`word_grp`,`word_no`,`word`,`id_cstat`,`cstat_order`);
KEY `ix_dstat_grp_no_word_id_order` (`word_grp`,`word_no`,`word`,`id_cstat`,`cstat_order`);
KEY `ix_dstat_nt_grp_word_id_order` (`name_type`,`word_grp`,`word`,`id_cstat`,`cstat_order`);

これにより、インデックス付きの読み取りに関する問題が部分的に解決されます。ただし、ソートは常にファイルソートを使用して行われます。

EXPLAIN

1, 'SIMPLE', 'W0', 'ref', 'ix_dstat_nt_word_id_order,ix_dstat_word_id_order,ix_dstat_nt_grp_no_word_id_ord‌er,ix_dstat_nt_grp_word_id_order', 'ix_dstat_nt_word_id_order', '93', 'const,const', 1, 'where; インデックスの使用; ファイルソートの使用
1, 'シンプル', 'cstat', 'eq_ref', 'プライマリ,ix_cstat_id_order', 'プライマリ', '8', 'search_2012_q3_cze_svk_dev.W0.id_cstat', 1, ''
4

3 に答える 3

0

次のインデックスを追加することで問題が解決します。

KEY `ix_dstat_nt_word_order_id_grp_no`(` name_type`、 `word`、` cstat_order`、 `id_cstat`、` word_grp`、 `word_no`);
KEY `ix_dstat_word_order_id_grp_no`(` word`、 `cstat_order`、` id_cstat`、 `word_grp`、` word_no`);
于 2012-10-30T13:26:21.957 に答える
0

cstat.id_cstat に 1 つのインデックス、単語用の dstat に 1 つのインデックス、および name_type が必要なようです。

于 2012-10-29T15:20:35.447 に答える
0

indexテーブルを変更し、テーブルの列を追加しid_cstatますdstat

ALTER TABLE dstat ADD INDEX tb_idx(id_cstat)

したがって、テーブル全体のスキャンは必要なく、テーブル上でも必要ですcstat

ALTER TABLE cstat ADD INDEX tba_idx(`order`)
于 2012-10-29T15:20:52.333 に答える