5

このようなテーブルがあります

CREATE TABLE IF NOT EXISTS `tbl_folder` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `owner_userid` int(11) NOT NULL,
  `name` varchar(63) NOT NULL,
  `description` text NOT NULL,
  `visibility` tinyint(4) NOT NULL DEFAULT '2',
  `num_items` int(11) NOT NULL DEFAULT '0',
  `num_subscribers` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `owner_userid` (`owner_userid`),
  KEY `vis_sub_item` (`visibility`,`num_subscribers`,`num_items`)
) ENGINE=InnoDB

可視性、num_subscribers、および num_items に関するインデックスがあるため、最初の 15 行のみを調べる必要があると予想しますが、EXPLAIN では 55856 行と表示されます。何か案が?ありがとう

EXPLAIN SELECT t.id, name, description, owner_userid, num_items, num_subscribers
FROM  `tbl_folder`  `t` 
WHERE visibility =2
ORDER BY  `t`.`num_subscribers` DESC ,  `t`.`num_items` DESC 
LIMIT 15

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t ref vis_sub_item vis_sub_item 1 const 55856 Using where
4

3 に答える 3

2

あなたの 3 フィールド インデックスは見栄えがよく、EXPLAIN有望です。

「55856 行」と表示されていますが、これは が提供する推定値EXPLAINです。

以来key_len =1、複合インデックスの最初のバイトを等価/参照として使用していることがわかります。

フィールドにファイルソートが記載されていないため、 /ソートインデックスによって処理されているExtraことがわかります。ORDER BY

セッションの統計を確認するとhandler_%、実際に読み取られている行数をより正確に把握できます。

副次的な考え:

行を取得するために最終的にディスクにヒットすることがわかっているため、データの 99% が(推測だけで) ある場合、 &visibility=2だけに複合インデックスを使用しても、同様に良好で高速な結果が得られる可能性があります。または、カーディナリティ/一意性に応じて 、に単一のインデックスがある場合は、ほぼ間違いなく同じくらい高速です。num_subscribersnum_itemsnum_subscribers

于 2010-12-08T21:26:56.540 に答える
0

or句 をEXPLAIN見ていないと思います。クエリの実行方法、使用したキー、テーブルの結合方法などを示すことになっています。この句は、クエリ後の修飾子のようなものです...必要なものがわかったので、最初のものだけを指定しますたくさんの。したがって、行フィールドには、クエリに存在する可能性のある行の数が含まれています。そこから、必要なものを選択します。OFFSETLIMITEXPLAINLIMITOFFSETLIMIT

SELECTなしで実行するとEXPLAIN、必要な数のレコードが得られると考えています。

于 2010-12-08T20:27:08.493 に答える
0

はい、問題はインデックスが正しくないことです。つまり、3 つのフィールドすべてにインデックスを付け、選択クエリは 1 つだけをチェックします。MySQL では、2 つの行を個別にインデックス化することは、3 つの行を一緒にインデックス化することとは異なります。

試す

CREATE TABLE IF NOT EXISTS `tbl_folder` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `owner_userid` int(11) NOT NULL,
  `name` varchar(63) NOT NULL,
  `description` text NOT NULL,
  `visibility` tinyint(4) NOT NULL DEFAULT '2',
  `num_items` int(11) NOT NULL DEFAULT '0',
  `num_subscribers` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `owner_userid` (`owner_userid`),
  KEY `vis_index` (`visibility`),
  KEY `vis_sub_item` (`num_subscribers`,`num_items`)
) ENGINE=InnoDB
于 2010-12-08T20:48:57.353 に答える