私は多能なソースからの結果である断片化されたデータベースを持っていますが、いくつかは共通の列すべてのデータを持っていません。私はソースを基にして、結果のテーブル全体が列char(1)を取得し、すべての値が ''に設定されます。データがインポートされると、まれな例外を除いて読み込まれます。パフォーマンスを念頭に置いてmysql列にnull値または空値を返すのはどうですか?
mysqlに与えられた列に対して常にnullまたは 'result'を返すようにするのがパフォーマンス上の賢明な方法ですか?私はchar(0)をテストしましたが、テーブルスキャンを強制します。列を選択する静的にテーブルのレイアウトを検索する必要はありません(SELECT ''としてip)。結果(IP)で
CREATE TABLE `shard1` (
`id` int(11) NOT NULL,
`type` varchar(128) NOT NULL DEFAULT '',
`message` TEXT NOT NULL DEFAULT '',
`ip` varchar(39) NOT NULL
PRIMARY KEY (`id`),
KEY `type` (`type`),
KEY `ip` (`ip`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
結果(IP)なし
CREATE TABLE `shard2` (
`id` int(11) NOT NULL,
`type` varchar(128) NOT NULL DEFAULT '',
`message` TEXT NOT NULL DEFAULT '',
`ip` char(1) NOT NULL
PRIMARY KEY (`id`),
KEY `type` (`type`),
KEY `ip` (`ip`,`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
選択は、これは、システムの過度に単純化した表現であり、この
SELECT type,message,ip FROM shard1 WHERE id = 123;
SELECT message,ip FROM shard1 WHERE ip = '127.0.0.1';
SELECT message,ip FROM shard1 WHERE type = 'error' and ip = '127.0.0.1';
のような典型的です。最小のシャードテーブルはわずか27行で、最大のものは500m以上の行です。パフォーマンスは現在約0.05秒で受け入れられますが、私は常に物事をより効率的にするのが大好きです。
レコードの内容がそのレコードを参照するロジックと関係しているかどうかわかりません。 '常にnullまたは' 'result'を返す...あなたはこれによって何を意味するかを詳しく説明できますか? –
テーブルの中にはIPアドレスがないものもありますが、ipカラムで検索することができます。ヌルまたは ""の結果がソフトウェアで動作します。 char(0)テストは、mysqlクエリオプティマイザがスマートになり、1つの値しか得られなかったことを知り、テーブルスキャンをスキップすることを期待していました。 –
メッセージを選択するにはNULL ip FROM shard1' –