リレーショナルロジックにそれほど関心がなく、非常に高速な読み取り速度が必要で、RDBMSを使用したい場合、MySQLと言うのは偏見に過ぎません。なぜ ???
MyISAMストレージエンジンには、パフォーマンスを向上させるためにテーブルの物理構造を拡張できるオプションがあります。そのオプションは何ですか?ALTER TABLEオプションROW_FORMAT。
たとえば、MySQL Database Design and Tuningは、72,73ページでROW_FORMAT = FIXEDを使用することを推奨しています。これにより、すべてのVARCHARフィールドが内部的にCHARに変換されます。MyISAMテーブルが大きくなりますが、それに対して実行されたSELECTははるかに高速になります。私はこれを個人的に証明できます。かつて1.9GBのテーブルがありました。ALTER TABLE tblname ROW_FORMAT = FIXEDでフォーマットを変更しました。テーブルは3.7GBになりました。それに対するSELECTの速度は、他に何も改善したり変更したりすることなく、20〜25%速くなりました。
データが入力されたMyISAMテーブルが既にある場合はどうなりますか?MyISAMテーブルにあるデータに基づいて、推奨される列定義のメトリックを取得できます。それらのメトリックを示すクエリは何ですか?
SELECT * FROM tblname PROCEDURE ANALYSE();
PROCEDURE ANALYZE()これはデータを表示しません。すべての列の値を読み取り、列の定義を推奨します。たとえば、値が1〜4のタイプ列がある場合、それらの4つの値のENUMを使用して提案します。その後、同じ量のスペース(1バイト)を使用するため、TINYINTまたはCHAR(1)の使用を選択できます。
他に考慮すべきことがあります:NoSQL DBの使用を考えていたので、NoISA方式でMyISAMを使用することを考えたことがありますか?これはかなり可能です。私が言及したのと同じ本の175ページでは、HANDLER構造を使用して、リレーショナル手荷物なしでテーブルを読み取ることを提案しています。実際、175ページにこの例を示します。
CREATE TABLE customer_mileage_details
(
customer_id INT NOT NULL,
ff_number CHAR(10) NOT NULL,
transaction_date DATE NOT NULL,
mileage SMALLINT NOT NULL,
INSERT(customer_id),
INSERT (ff_number,transaction_date)
) ENGINE = MYISAM;
このテーブルには数百万行が含まれています。次の要件を持つデータ分析アプリケーションを作成する必要があるとします。
- 情報ブロックをできるだけ早く取得する必要があります。
- ユーザーの入力またはその他の要因に基づいて、テーブル内で「ジャンプ」する可能性があります。
- 並行性またはその他のデータ整合性の問題には関係ありません。
- アプリケーション間のテーブルロックは必要ありません。
これらのコマンドは、テーブルからの迅速で汚れた読み取りを許可します。
HANDLER customer_mileage_details OPEN;
HANDLER customer_mileage_details READ ff_number FIRST WHERE ff_number=('aaetm-4441');
HANDLER customer_mileage_details READ NEXT LIMT 10;
HANDLER customer_mileage_details CLOSE;
これが思考の糧になることを願っています。調べてみてください。
警告
この特定の投稿を書いている私にとって非常に皮肉なのは、Percona Serverバイナリで使用されているHANDLERについての以前の投稿を書いており、それを使用することは時代遅れだと考えていることです。その古い投稿以来、私はHANDLER構造をサポートする何かを書くとは考えていませんでした。私は今修正されたままです。