3

インデックスの使用を拒否するテーブルがあり、常にfilesortを使用しています。

表は次のとおりです。

CREATE TABLE `article`(
  `ID` int(11)NOT NULL AUTO_INCREMENT、
  `Category_ID` int(11)DEFAULT NULL、
  `サブカテゴリ`int(11)DEFAULT NULL、
  `CTimestamp`タイムスタンプNOTNULLDEFAULT CURRENT_TIMESTAMP、
  `公開`tinyint(4)DEFAULT NULL、
  `Administrator_ID` int(11)DEFAULT NULL、
  `Position` tinyint(4)DEFAULT '0'、
  主キー( `ID`)、
  KEY `Subcategory`(` Subcategory`、 `Position`、` CTimestamp`、 `Publish`)、
  KEY `Category_ID`(` Category_ID`、 `CTimestamp`、` Publish`)、
  KEY `Position`(` Position`、 `Category_ID`、` Publish`)、
  KEY `CTimestamp`(` CTimestamp`)、
  CONSTRAINT `article_ibfk_1`外部キー(` Category_ID`)参照 `category`(` ID`)
)ENGINE = InnoDB AUTO_INCREMENT = 94290 DEFAULT CHARSET = utf8

クエリは次のとおりです。

SELECT*FROM記事ORDERBY`CTimestamp`;

説明は次のとおりです。

+ ---- + ------------- + --------- + ------ + ------------- -+ ------ + --------- + ------ + ------- + --------------- -+
| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| エクストラ|
+ ---- + ------------- + --------- + ------ + ------------- -+ ------ + --------- + ------ + ------- + --------------- -+
| 1 | シンプル| 記事| すべて| NULL | NULL | NULL | NULL | 63568 | filesortの使用|
+ ---- + ------------- + --------- + ------ + ------------- -+ ------ + --------- + ------ + ------- + --------------- -+

「ORDERBY」を削除すると、すべてが正常に機能しています。他のすべてのインデックス(サブカテゴリ、位置など)は、他のクエリで正常に機能しています。残念ながら、私の単純なselectクエリでも、タイムスタンプの使用は拒否されます。私はここで重要な何かを見逃していると確信しています。

MySQLにタイムスタンプインデックスを使用させるにはどうすればよいですか?

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

4

2 に答える 2

5

この場合、MySQL はソートにインデックスを使用していません。これは良いことです。なんで?テーブルには 64,000 行しか含まれておらず、平均行幅は約 26 バイト (列サイズを正しく追加した場合) であるため、ディスク上のテーブルの合計サイズは約 2MB になるはずです。わずか 2MB のデータをディスクからメモリに読み込み (おそらく 1 ~ 2 回のディスク操作またはシークで)、メモリ内で単純にファイルソートを実行する (おそらくクイックソートのバリエーション) のは非常に安価です。

MySQL がインデックス順で検索した場合、64000 回のディスク シーク操作を 1 レコードずつ実行する必要があります。それは非常に、非常に遅かったでしょう。

インデックスは、WHERE 句のように、巨大なファイル内の既知の場所にすばやくジャンプし、少量のデータのみを読み取るために使用できる場合に適しています。しかし、この場合、それは良い考えではありません - そして MySQL は愚かではありません!

テーブルが非常に大きい (RAM サイズよりも大きい) 場合、MySQL は確実にインデックスを使用し始めます。これも良いことです。

于 2012-10-25T08:06:04.343 に答える
0

さて、あなたはいつでもインデックスをほのめかすことができます。クエリをに変更します

SELECT * FROM article use index (CTimestamp);

これにより、MySQLはクエリにインデックスを使用するように強制されます。説明:

1, 'SIMPLE', 'article', 'ALL', '', '', '', '', 1, 100.00, ''

表示するファイルソートはありません。使用されるインデックスはCTimestampであるため、結果はそれに応じて並べ替える必要があります。

または、句ごとに順序を維持することもできますが、インデックスの使用を強制します。

SELECT * FROM article force index (CTimestamp) order by CTimestamp;

しかし、問題はまだ奇妙です。公式のMySQLヘルプフォーラムに投稿することを検討しましたか?

編集:あなたは良い仲間にいるようです。
編集:インデックスを強制することはうまくいくようです。

于 2012-10-25T07:57:39.307 に答える