1つの行のフィールドに基づいてインデックスに複数のエントリを作成する方法は?

dba.stackexchange https://dba.stackexchange.com/questions/186

  •  16-10-2019
  •  | 
  •  

質問

インデックスのエントリとして1つの行の複数のフィールドをインデックス化したり、MySQLでこの機能をシミュレートする良い方法を見つけたことはありません。

問題は、タグまたは同様の概念として機能するフィールドがある場合に発生します。例:fields名はtag1、tag2、tag3です。特定のタグ高速で行を検索するには、3つのインデックスがあり、最も基本的で明白な方法で3つの個別のクエリを実行する必要があります。

これらの3つのフィールドを1つのインデックスのエントリとしてインデックス化する方法はありますか?

ID tag1 tag2 tag3
-- ---- ---- ----
01 abc  xyz  bla
02 foo  bar  ble
03 xyz  bla  bar

index
abc -> 01
bar -> 02 03
bla -> 01 03
ble -> 02
foo -> 02
xyz -> 01 03

それとも、これを効率的に行う他の方法はありますか?

役に立ちましたか?

解決

私が正しく理解しているなら、このクエリは機能するはずです:

SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;

このテーブル構造を考えると、

CREATE TABLE `testTag` (
  `id` int(11) NOT NULL,
  `tag1` varchar(10) DEFAULT NULL,
  `tag2` varchar(10) DEFAULT NULL,
  `tag3` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `tags` (`tag1`,`tag2`,`tag3`)
) ENGINE=InnoDB

mysql> EXPLAIN SELECT id FROM testTag WHERE LOCATE('bar', CONCAT(tag1,'.',tag2,'.',tag3)) > 0;
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table   | type  | possible_keys | key  | key_len | ref  | rows |     Extra                    |    
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | testTag | index | NULL          | tags | 39      | NULL |   15 | Using where; Using index |
+----+-------------+---------+-------+---------------+------+---------+------+------+--------------------------+

他のヒント

番号付きのフィールド名を持っているときはいつでも、テーブルを正規化しません。代わりに、「タグ」テーブルを持っている可能性があります。タグ付けしているものに参加できます。

ID tag
-- ---
01 abc
01 xyz
01 bla
02 foo
02 bar
02 ble
03 xyz
03 bla
03 bar

(プライマリキーはマルチコラムであり、マルチカラムインデックスの2番目のフィールドであれば、追加のインデックスがあります)

タグが特定の順序である必要がある場合は、いつでも「注文」列を追加できます。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top