1つの行のフィールドに基づいてインデックスに複数のエントリを作成する方法は?
-
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番目のフィールドであれば、追加のインデックスがあります)
タグが特定の順序である必要がある場合は、いつでも「注文」列を追加できます。
所属していません dba.stackexchange