4

ここから始めるには、関連するテーブルの簡略化されたバージョンがあります。

tbl_map約 4,000,000 行あり、tbl_1約 120 行あり、tbl_2約 5,000,000 行が含まれています。Google や Yahoo! などがはるかに大きなデータセットを使用していることを考えると、データがそれほど大きくないと考えるべきではないことはわかっています。だから私は何かが欠けていると仮定しています。

    CREATE TABLE `tbl_map` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `tbl_1_id` bigint(20) DEFAULT '-1',
      `tbl_2_id` bigint(20) DEFAULT '-1',
      `rating` decimal(3,3) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `tbl_1_id` (`tbl_1_id`),
      KEY `tbl_2_id` (`tbl_2_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    CREATE TABLE `tbl_1` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
   ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    CREATE TABLE `tbl_2` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `data` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

対象のクエリ: また、 の代わりORDER BY RAND()ORDERY BY t.id DESC. クエリは 5 ~ 10 秒ほどかかり、ユーザーがこのページを表示するときにかなりの待ち時間が発生します。

EXPLAIN SELECT t.data, t.id , tm.rating
FROM tbl_2 AS t
JOIN tbl_map AS tm 
ON t.id = tm.tbl_2_id
WHERE tm.tbl_1_id =94
AND tm.rating IS NOT NULL
ORDER BY t.id DESC
LIMIT 200 

1   SIMPLE  tm  ref     tbl_1_id, tbl_2_id  tbl_1_id    9   const   703438  Using where; Using temporary; Using filesort
1   SIMPLE  t   eq_ref  PRIMARY     PRIMARY     8   tm.tbl_2_id     1 

クエリを高速化したい、適切なインデックスがあることを確認したいなどです。DB Gurus からのアドバイスに感謝します! ありがとう。

4

2 に答える 2

2

提案 : 次のようにテーブルにインデックスを付けます。

ALTER TABLE tbl_map ADD INDEX (tbl_1_id,rating,tbl_2_id);
于 2012-05-15T16:07:54.843 に答える
2

Rolando によると、はい、間違いなくマップ テーブルにインデックスが必要ですが、表 2 の ID の ORDER BY 句用の tbl_2_id も含めるように拡張します (これはマップと同じテーブルにあるため、それを使用するだけです)。また、インデックスは 3 つのフィールドすべてを保持するようになり、キー検索の ID と評価の null (またはない) の基準に基づいているため、3 番目の要素には ORDER BY 句の順序でそれらが既に含まれています。

INDEX (tbl_1_id、評価、tbl_2_id);

次に、クエリを次のようにします

SELECT STRAIGHT_JOIN 
      t.data, 
      t.id , 
      tm.rating
   FROM 
      tbl_map tm
         join tbl_2 t
            on tm.tbl_2_id = t.id
   WHERE 
          tm.tbl_1_id = 94
      AND tm.rating IS NOT NULL
   ORDER BY 
      tm.tbl_2_id DESC
   LIMIT 200 
于 2012-05-15T16:31:39.727 に答える