5

フィールドが原因で問題が発生していLONGTEXTます。すべて正常に動作しますが、WHERE 句を含む SELECT クエリを実行すると、mysql がスリープ状態になり、戻りません。80k レコードしかなく、明示的な WHERE 比較は正常に機能します。(一部のレコードは 1M を超え、約 700K のものはほとんどありませんが、残りはわずか 60 ~ 100KB です)。

例えば:

[HANGs]
SELECT * FROM item_info 
WHERE added_on > '2013-02-14 19:40:05' AND added_on < '2013-02-15 19:40:05'    
;which is like 2 rows only

[FINE]
SELECT * from item_info
WHERE item_id in (1, 10, 1000)

これは通常の動作ですか?

スキーマは次のとおりです。

CREATE TABLE `item_info` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title_md5` varchar(35) NOT NULL,
  `original_document` longtext NOT NULL,
  `added_on` datetime NOT NULL,
  PRIMARY KEY (`item_id`),
  UNIQUE KEY `md5_Unique` (`title_md5`)
) ENGINE=MyISAM AUTO_INCREMENT=87781 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;

解決策はありますか?または、ロングテキスト フィールドを外部キーで新しいテーブルに分割する必要がありますか?

4

2 に答える 2

5

MyISAMテーブルを使用しています。には存在しない制限がありInnoDBます。

MyISAMは、一部のフィールドが SELECT でクエリされない場合でも、常にディスクから完全な行を読み取ります。

スキーマは、 にインデックスがあるようですが、 にはありitem_idませんadded_on

にインデックスがないためadded_on、クエリは完全なテーブル スキャンを生成します。MyISAM長い行を持つテーブルのフル テーブル スキャンでは、ディスクから大量のデータを読み取る必要があります。

インデックスを追加するadded_onと、実際に必要なテーブル行のみを読み取る必要があるため、クエリがかなり高速化されます。

于 2013-06-05T14:54:35.233 に答える