0

私は現在、MYSQLデータベースに保存されているデータの変更を含むプロジェクトに取り組んでいます。作業中のテーブルにはキーがないため、次のコマンドでキーを追加します。

ALTER TABLE deCoupledData ADD COLUMN MY_KEY INT NOT NULL AUTO_INCREMENT KEY

選択したフィールドに従ってレコードをグループ化したいので、MY_KEYと選択したフィールドで構成されるテーブルdeCoupledDataのインデックスを作成しようとしています。たとえば、フィールドSTATED_FおよびNOT_STATED_Fを操作する場合は、次のように入力します。

ALTER TABLE deCoupledData ADD INDEX (MY_KEY, STATED_F, NOT_STATED_F)

本当の問題は、私が通常使用するフィールドが16を超えることです。そのため、MYSQLは16フィールドを超えるスーパーキーを許可しません。結論として、これを行う別の方法はありますか?(どういうわけか)MYSQLを作成して、目的のスーパーキー(クラスタリングなど)に従ってレコードを並べ替えることはできますか?私は本当にスクリプトを高速化する必要があります。主なオーバーヘッドは、各グループにディスクの同じページに保存されていないレコードが含まれている可能性があることです。PCはレコードを取得するためにランダムなI/Oを開始すると想定しています。

お時間をいただきありがとうございます。Nick Katsipoulakis

CREATE TABLE deCoupledData ( 
AA double NOT NULL DEFAULT '0', 
STATED_F double DEFAULT NULL, 
NOT_STATED_F double DEFAULT NULL, 
MIN_VALUES varchar(128) NOT NULL DEFAULT '-1,-1', 
MY_KEY int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (MY_KEY), 
KEY AA (AA) ) 
ENGINE=InnoDB AUTO_INCREMENT=74358 DEFAULT CHARSET=latin1
4

1 に答える 1

2

さて、まず第一に、複数の列にインデックスを追加し、実際には最初の列を使用しない場合、インデックスは役に立ちません。

例:次のようなクエリがあります

SELECT *
FROM deCoupledData 
WHERE
stated_f = 5
AND not_stated_f = 10

およびインデックス(MY_KEY、STATED_F、NOT_STATED_F)。

インデックスはAND my_key = 1、WHERE句に別の何かがある場合にのみ使用できます。

「ジョン」という名の電話帳ですべての人を検索したいとします。その場合、本が姓でソートされているという知識は役に立たず、それでもすべての名前を検索する必要があります。

また、主キーは代理/人工キーである必要はありません。とにかく各行を一意に識別する列で構成される主キーを使用することをお勧めします。

また、多くのインデックスを持つことは必ずしも良いことではありません。インデックスはINSERTとUPDATEを遅くするだけでなく、最初にインデックスを調べ、次に実際のデータを見つけるために、余分なルックアップを引き起こすことがあります。

それはほんの少しのヒントです。ジョーダンのヒントは悪い考えではないかもしれません。「実際のSQLクエリ、テーブルレイアウト、パフォーマンスに関する質問を含む新しい質問を投稿する必要があります」。

アップデート:

はい、それは可能です。マニュアルによると

テーブルにPRIMARYKEYを定義すると、InnoDBはそれをクラスター化インデックスとして使用します。

これは、データが実際にディスク上でソートされていることを意味します。

複数の列に主キーを定義することも可能であることに注意してください。

好き

CREATE TABLE deCoupledData ( 
AA double NOT NULL DEFAULT '0', 
STATED_F double DEFAULT NULL, 
NOT_STATED_F double DEFAULT NULL, 
MIN_VALUES varchar(128) NOT NULL DEFAULT '-1,-1', 
MY_KEY int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (NOT_STATED_F, STATED_F, AA), 
KEY AA (AA) ) 
ENGINE=InnoDB AUTO_INCREMENT=74358 DEFAULT CHARSET=latin1

列の組み合わせが一意である限り。

于 2012-08-23T14:19:14.123 に答える