2

この構造のテーブルがあります(50kフィールド):

CREATE TABLE IF NOT EXISTS `comments` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `imageid` int(10) unsigned NOT NULL DEFAULT '0',
  `uid` bigint(20) unsigned NOT NULL DEFAULT '0',
  `content` text CHARACTER SET utf8,
  `adate` datetime DEFAULT NULL,
  `ip` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ids` (`imageid`,`adate`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=52236 ;

imageidでデータを選択し、日付で並べ替えたいので、(imageidadate)キーを追加しました。

しかし、このクエリの説明の結果は、MuSQLがまだテーブルスキャンを使用していることを示しています。なぜ?!

EXPLAIN SELECT   comments.*
FROM comments
WHERE comments.imageid=50
ORDER BY
comments.adate DESC LIMIT 10

結果:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  comments    ref     ids     ids     4   const   203     Using where

そしてこのインデックスで:

KEY `ids` (`imageid`,`adate`,`id`) USING BTREE

このクエリの結果:

EXPLAIN SELECT   comments.id
FROM comments
WHERE comments.imageid=50
ORDER BY
comments.adate DESC LIMIT 10

は:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  comments    ref     ids     ids     4   const   203     Using where; Using index
4

3 に答える 3

1

Explainの結果を正しく読んでいません。

using indexクエリがインデックスでカバーされていることを意味します。データはインデックスからのみ読み取られ、実際の行は使用されません。これは、インデックスが異なるためではなく、2番目のクエリでIDのみを選択しているためです。

MySQLが解決にインデックスを使用しない場合ORDER BYusing filesort、説明にあります。どちらのクエリでも、idsキーが使用され、MySQLはテーブルスキャンを実行しません

于 2012-04-15T14:24:02.493 に答える
0

InnoDB の場合、次のようなキーを作成します (imageid,adate,id); インデックス内の列の順序は重要です。

次に、これを試してください-

EXPLAIN SELECT   comments.id
FROM comments
WHERE comments.imageid=50
ORDER BY
comments.adate DESC LIMIT 10

出力が何であるか教えてください。

出力していただきありがとうございます。以下のセクションを以下に追加します。

id以上が必要な場合は、次のようなものを試してください

EXPLAIN 
SELECT c1.* from comments as c1
JOIN
(
   SELECT comments.id
   FROM comments
   WHERE comments.imageid=50
   ORDER BY
   comments.adate DESC LIMIT 10
) as c2 ON (c1.id=c2.id)

ただし、今回は Explain に依存しません。Explain はとにかくインデックス付きの 1 行を表示します。むしろ、phpmyadmin または mysql クエリ ブラウザで実行時間を確認してください。

于 2012-04-15T13:53:24.847 に答える
0

マニュアルからまっすぐ:

場合によっては、MySQL はインデックスを使用して ORDER BY を解決することはできませんが、引き続きインデックスを使用して WHERE 句に一致する行を検索します。––– キーの連続しない部分で ORDER BY を使用する場合: SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

コンポジットがKEY ids (imageid,adate)ありimageidORDER BY. のみのキーを追加してみて、adateそれが役立つかどうかを確認できます。

于 2012-04-15T13:56:09.407 に答える