2012-02-13 3 views
2

私は6~7lacsレコードのテーブルを持っています。それは時間がたつにつれて大きくなるでしょう。それには16-20カラム程度あります。これらの列には1対多の関係はありません。SQLテーブル分割 - 必要ですか

ユーザデータエントリは、これらのテーブルに格納されます。

テーブルを複数の小さなテーブルに分割することも可能ですし、テーブルを2つの半分のテーブルに分割して、その中のすべてのエントリと、データ入力演算子に供給される最新のレコードをフィードすることができます彼らのエントリに。

短い質問では、私はテーブルを分割するとmysqlの実行時間が速くなるか、2つの半分に分割する方が速くなるかどうかです。

私は、後者はどんな結合クエリも実行しないのでより実現可能性が高いと思います。更新

CREATE TABLE `images` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `primary_category_id` int(10) unsigned DEFAULT NULL, 
    `secondary_category_id` int(10) unsigned DEFAULT NULL, 
    `front_url` varchar(255) DEFAULT NULL, 
    `back_url` varchar(255) DEFAULT NULL, 
    `title` varchar(100) DEFAULT NULL, 
    `part` varchar(10) DEFAULT NULL, 
    `photo_id` int(10) unsigned DEFAULT NULL, 
    `photo_dt_month` varchar(2) DEFAULT NULL, 
    `photo_dt_day` varchar(2) DEFAULT NULL, 
    `photo_dt_yr` varchar(4) DEFAULT NULL, 
    `type` varchar(25) DEFAULT NULL, 
    `size_width` int(10) unsigned DEFAULT NULL, 
    `size_height` int(10) unsigned DEFAULT NULL, 
    `dpi` int(10) unsigned NOT NULL DEFAULT '0', 
    `dpix` int(10) unsigned DEFAULT NULL, 
    `dpiy` int(10) unsigned DEFAULT NULL, 
    `in_stock` varchar(50) DEFAULT NULL, 
    `outlet` varchar(50) DEFAULT NULL, 
    `source` varchar(50) DEFAULT NULL, 
    `keywords` varchar(255) DEFAULT NULL, 
    `emotional_keywords` varchar(255) DEFAULT NULL, 
    `mechanical_keywords` varchar(255) DEFAULT NULL, 
    `description` text, 
    `notes` text, 
    `comments` text, 
    `exported_to_ebay_dt` datetime DEFAULT NULL, 
    `exported_to_ebay` set('Y','N') NOT NULL DEFAULT 'N', 
    `updated_worker_id` int(10) unsigned DEFAULT NULL, 
    `updated_worker_dt` datetime DEFAULT NULL, 
    `locked_worker_id` int(10) unsigned DEFAULT NULL, 
    `locked_worker_dt` datetime DEFAULT NULL, 
    `updated_admin_id` int(10) unsigned DEFAULT NULL, 
    `updated_admin_dt` datetime DEFAULT NULL, 
    `added_dt` datetime DEFAULT NULL, 
    `updated_manager_id` int(10) unsigned DEFAULT NULL, 
    `updated_manager_dt` datetime DEFAULT NULL, 
    `manager_review` set('Y','N') NOT NULL DEFAULT 'N', 
    `paid_status` set('Y','N') NOT NULL DEFAULT 'N', 
    `exported_to_web_dt` datetime DEFAULT NULL, 
    `exported_to_web` set('Y','N') DEFAULT 'N', 
    `prefix` varchar(50) DEFAULT NULL, 
    `is_premium` set('Y','N') DEFAULT 'N', 
    `template` varchar(50) DEFAULT 'HIPE_default', 
    `photographer` varchar(100) DEFAULT NULL, 
    `copyright` varchar(100) DEFAULT NULL, 
    `priority` int(4) DEFAULT '1', 
    `step` set('1','2') DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `part` (`part`), 
    KEY `primary_category_id` (`primary_category_id`), 
    KEY `updated_worker_id` (`updated_worker_id`), 
    KEY `updated_worker_dt` (`updated_worker_dt`) 
) ENGINE=MyISAM AUTO_INCREMENT=1013687 DEFAULT CHARSET=latin1 

以上が私のテーブルですstructure.After作られているエントリがあるが、この実現可能な同じstructure.Isでimages_historyを言うか、私はそれらを分割する必要があり、私は別のテーブルに分割します1lacの周りに言います複数のテーブルにクエリ実行時間を短縮する

+0

はあなたには、いくつかのDDLを記述する追加できますおおまかにあなたのテーブルはどのように見え、それが分割されたように見えるのでしょうか? –

+0

編集のおかげで... didn 'なぜフォーマットしていないのか分かりません。 –

+0

'6-7lks'とは何ですか? – DisgruntledGoat

答えて

1

なぜテーブルを分割したいですか?新しいテーブルの両方にアクセスしたい場合は、追加のコードを追加し、実行時間を遅くします。 (テーブルの1つにイメージテーブルのレコードのほとんど使用されなかった以前のバージョン(つまりバージョン管理)を保存しようとすると、それでもまだ良いアイデアかもしれません)。でも、テーブルを分割を考える前に

、あなたは次のパフォーマンス災害の確認どれを作っていないことで、既存のコードを最適化することにより、パフォーマンスを向上させることができるかどうかを確認は、以下のとおりです。

  • はPRIMARY KEYですべて選択フィルタをか?
  • インデックスキャッシュは、コンピュータのRAM内のすべてのインデックスを保持するのに十分な大きさですか?
  • インデックスにLIKEを使用してSELECTと一致する文字列はありますか?私。正確な一致またはワイルドカードのみを左に決して使用しないでください(例: "searchword%"と決して "%searchword"
  • 必要な列だけを選択するのではなく、SELECT *を使用するクエリの実行速度が遅いですか?
  • あなたが使用してORのSELECTに避けてきた?tabelsが適切にインデックス化され、クエリが実際にこれらの指標を使用している場合、700件の000レコードを持つテーブルにクエリを実行

が遅くなることはないはずです。

+0

インデックスを作成するとパフォーマンスが向上しますが、15〜20列程度のテーブルを分割するとどうなりますか?それぞれが5〜6列を持ち、良好な索引付けを有する3〜4個の表に変換する。これは私のSQL実行時間を短縮するだろうか?それは私の本物の質問 –

+0

BLOB種類(TEXT、LONGTEXT)の列を持っている場合、SELECT *またはSELECT blobcolumnはRAMの代わりにディスク上のTMPテーブルにデータを書き込むよう強制します。多くの列を使用すると、インデックス付きの列を使用して実際に使用する列に実際にアクセスする場合、AFAIKは何も速度を落とさないでしょう。 –

+0

@ Harald:ありがとう!私は多くのテキスト列が2-3(上記の私の構造を確認してください)していません.Soは、クエリの実行時間が増えるでしょう。私はSelect *などのクエリを実行した場合、私はいくつかの列のみインデックスを持っている。それから必然? –

関連する問題