0

Mysql データベースに可変列が必要です。meta_data私はヘルパーテーブルを持つという代替手段を使用しています。の各行に変数列を格納しますmeta_data。の構造meta_dataは次のとおりです。

CREATE TABLE IF NOT EXISTS `data_meta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data_id` int(11) DEFAULT NULL,
  `meta_key` varchar(200) CHARACTER SET utf8 DEFAULT NULL,
  `meta_value` text CHARACTER SET utf8,
  PRIMARY KEY (`id`),
  KEY `data_id` (`data_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=347 ;

これらの変数列のいくつかに対してクエリを実行する必要があります。だから私の質問は、Mysqlでのそのようなステートメントのコストはいくらですか:

select * 
from data
join data_meta as data_prov on (data.id=data_prov.data_id)
join data_meta as data_city on (data.id=data_city.data_id)
join data_meta as data_price on (data.id=data_price.data_id)
.
.
.
.

現実の世界で、これによりクエリが非常に遅くなる可能性がある場合、代替手段はありvariable columnsますか?

:dataとの両方meta_dataが急速に成長する可能性があります

4

1 に答える 1

2

データが正しく索引付けされている場合、複数の結合は問題になりません。この場合、data_meta(data_id, meta_key)または上のインデックスが必要です。data_meta(data_id, meta_key, meta_value)

ところで、私はあなたがmeta_keyロジックのアウトを残したと思います

select * 
from data
join data_meta as data_prov on (data.id=data_prov.data_id and data_prov.meta_key = 'prov')
join data_meta as data_city on (data.id=data_city.data_id and data_city.meta_key = 'city')
join data_meta as data_price on (data.id=data_price.data_id and data_price.meta_key = 'price')

キーごとに 1 つの一致しかないと仮定すると、次のようにクエリを実行することもできます。

select d.*,
       max(case when dm.meta_key = 'prov' then dm.meta_value end) as prov,
       . . .
from data join
     data_meta dm
     on d.id = dm.id
group by d.id;

1 つのメタ キーの値をフェッチする場合は、これで問題ありません。ただし、MySQL はアグリゲーションよりも結合を高速に実行する傾向があるため、一般的には結合メソッドの方がおそらく高速です。

編集:

このクエリをすばやく実行するには、メタ値をすばやく検索できる必要があります。MySQL でこれを行う最善の方法は、インデックスを使用することです。これにより、MySQL はメタデータの値をすばやく検索できます。他のデータベースは、並列ハッシュ結合と呼ばれるテクノロジをサポートしています。これにより、クエリも高速化されます (並列ハッシュ集約により、group by が高速化されます)。これらは MySQL のオプションではないため、インデックスを使用する必要があります。

于 2013-08-25T12:53:52.763 に答える