2

私はテーブルを持っています

CREATE TABLE `dataFullText` (
`id` int(11) NOT NULL,
`title` char(255) NOT NULL,
`description` text NOT NULL,
`name` char(100) NOT NULL,
`ref` char(50) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `fulltext` (`ref`,`name`,`title`,`description`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

これには約10万件のレコードがあります。

mysql> select * from information_schema.TABLES WHERE TABLE_NAME='jobsFullText'\G
*************************** 1. row ***************************
TABLE_CATALOG: NULL
TABLE_SCHEMA: ****
TABLE_NAME: dataFullText
TABLE_TYPE: BASE TABLE
ENGINE: MyISAM
VERSION: 10
ROW_FORMAT: Dynamic
TABLE_ROWS: 79495
AVG_ROW_LENGTH: 791
DATA_LENGTH: 62938804
MAX_DATA_LENGTH: 281474976710655
INDEX_LENGTH: 53625856
DATA_FREE: 51328
AUTO_INCREMENT: NULL
CREATE_TIME: 2011-10-03 13:38:25
UPDATE_TIME: 2011-10-03 13:55:56
CHECK_TIME: 2011-10-03 13:38:48
TABLE_COLLATION: utf8_general_ci
CHECKSUM: NULL
CREATE_OPTIONS: 
TABLE_COMMENT: 

このテーブルは、約 8k のレコードを持つ LOAD DATA INFILE で 1 時間ごとに更新されます。

テーブルがロックされる時間は約 30 秒です。私が作る時間に対応する

mysql> alter table dataFullText drop index title;
Query OK, 79495 rows affected (1.33 sec)
Records: 79495  Duplicates: 0  Warnings: 0

mysql> alter table dataFullText add fulltext index (ref,name,title,description);
Query OK, 79495 rows affected (22.96 sec)
Records: 79495  Duplicates: 0  Warnings: 0

私の問題は、30 秒が本当に長いことです。このテーブルは 5 回/秒クエリされるため、キューは 30 x 5 = 150 に達します。最大接続制限が 100 に設定されているため、mysql サーバーは一部の受信接続を拒否し始めます。

将来的には、このテーブルに少なくとも 100 万行を追加する予定ですが、これ以上速くなることはないと思います。

mysql がインデックスの更新に使用する時間を短縮するためにできることはありますか?

4

1 に答える 1

0

一般的な SQL DBMS では、このようにテーブルを完全にインデックス化しても役に立ちません。実際、インデックスはテーブル自体よりも大きいため、アクセスにかかる時間は、インデックスなしでテーブルにアクセスする時間よりもさらに長くなります。

さて、これはあなたが持っている特定のインストール、つまりRAMの量、システムの全体的な速度に大きく依存します. インデックスを追加する前に、はい、インデックスの更新/再作成は遅くなります。現在の特定の条件では、それだけの価値があることを確認してください.

于 2012-07-08T16:10:25.363 に答える