3

2列の非常に単純なテーブルがありますが、450万行あります。

CREATE TABLE `content_link` (
  `category_id` mediumint(8) unsigned NOT NULL,
  `content_id` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`content_id`,`category_id`),
  KEY `content_id` (`content_id`,`category_id`)
) ENGINE=MyISAM;

次のような単純なクエリを実行すると、次のようになります。

SELECT
    *   
FROM
    content_link
WHERE
    category_id = '11';

mysqlはCPUをスパイクし、約10行を返すまでに2〜5秒かかります。データはテーブル全体に非常に均等に分散されており、インデックス付きフィールドにアクセスしています(テーブルも分析/最適化しており、テーブルの内容を変更することはありません)。クエリにこれほど時間がかかる理由は何ですか。

編集:navicatが私に嘘をついているようで、テーブルが表示されていたため、主キーが実際には正しい順序でキー設定されていませんでした。

4

3 に答える 3

8

category_idインデックスの最初の列ではありません。

次のようにセカンダリ キーを再作成します。

UNIQUE KEY `ix_category_id` (`category_id`, `content_id`)

列の順序に注意してください。重要です。

于 2009-05-29T13:45:07.487 に答える
2

UNIQUE KEY の順序付けは適切な解決策であり、テーブルにもパーティション戦略を追加する必要があります。

テーブルをフラグメントに分割することにより、MySQL は適切なデータ セットで特定のパーティションをクエリします。応募しましたが、素晴らしい結果が得られました。

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
ENGINE=INNODB
PARTITION BY HASH( MONTH(tr_date) )
PARTITIONS 6;

MySQL 5.1 が必要です。

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html を試してください

于 2009-06-10T22:39:18.453 に答える
1

インデックスを使用していません。のような複合インデックスがある(content_id, category_id) 場合は、を使用してインデックスを使用するか、 andcontent_idを使用できます。インデックスを使用および利用することはできません。content_idcategory_idcategory_id

変更してみてください:

KEY `content_id` (`content_id`, `category_id`)

KEY `category_id` (`category_id`, `content_id`)
于 2009-05-29T13:50:17.993 に答える