1

次のような巨大なテーブルがあります。

CREATE TABLE `images` (
  `image_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `data` mediumblob,
  PRIMARY KEY (`user_id`,`image_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

blob フィールドを圧縮するクエリを実行する必要があります。MySQL は次のクエリでインデックスを使用できますか。

UPDATE images SET data = COMPRESS(data) WHERE (user_id = ? AND image_id = ?) OR (user_id = ? AND image_id = ?) OR (...) OR (...);

単一のクエリでテーブル全体を更新する方法がなく、user_id.

編集:explainそしてupdateうまくいきません、あなたたちはそれを知っていますよね?

4

5 に答える 5

2

はい、更新ではテーブルのインデックスが使用されます。これWHEREは、後に参照される列のみが主キーのスタンドであるためです。

クエリが何を使用するか不明な場合は、次のEXPLAINコマンドを自由に使用してください: http://dev.mysql.com/doc/refman/5.0/en/explain.html

于 2012-05-28T20:17:07.507 に答える
2

使用する

EXPLAIN SELECT data FROM images
  WHERE (user_id = ? AND image_id = ?)
    OR (user_id = ? AND image_id = ?)
    OR (...)
    OR (...);
于 2012-05-28T20:34:41.233 に答える
1

あなたの例では、MySQL が主キーをクラスター化インデックスとして使用することを期待しています。これは、インデックスがすべての列を格納し、実際にはディスク上のデータの唯一のバージョンであることを意味します。

はい、インデックスを使用します。sを含む条件orでは、MySQL がインデックスをスキャンする (シークしない) ことを期待します。

于 2012-05-28T20:16:11.010 に答える
1

これはEXPLAIN、あまり推測するよりも、使用して確認する方が適切です。

を実行する前EXPLAINに、 を発行ANALYZE TABLEして、クエリ オプティマイザが最適なクエリ プランを見つける可能性が最も高いことを確認してください。

于 2012-05-28T20:20:06.630 に答える
1

はい、おそらくインデックスを使用します (条件のカーディナリティが非常に低い場合を除きます)。

MySQL次の構文もサポートしています。

(user_id, image_id) IN ((user1, image1), (user2, image2), (user3, image3))

しかし、これはインデックスを使用しません (これは単なる実装上の欠陥です)。

次のクエリも使用できます。

UPDATE  (
        SELECT  user1 AS user_id, image1 AS image_id
        UNION ALL
        SELECT  user2 AS user_id, image2 AS image_id
        UNION ALL
        SELECT  user3 AS user_id, image3 AS image_id
        ) q
JOIN    images i
ON      (i.user_id, i.image_id) = (q.user_id, q.image_id)
SET     i.data = COMPRESS(i.data)

これもインデックスを使用します。

于 2012-05-28T20:44:11.670 に答える