正则表达式vs连接性能Mysql

正则表达式vs连接性能Mysql,mysql,regex,performance,Mysql,Regex,Performance,我在犹豫我应该用什么类型的。将会有很多ID和组,通常他们会教我做多个表,但是第二个版本的regexp看起来很棒,冗余更少。我很想知道这两个版本中的哪一个更好 +----+ +----+-------+ | ID | | ID | Group | +----+ +----+-------+ | 1 | | 1 | gr1 | | 1 | | 1 | gr2 | | 2 | | 2 | gr2 | | 2 | | 2 | gr3 | +--

我在犹豫我应该用什么类型的。将会有很多ID和组,通常他们会教我做多个表,但是第二个版本的regexp看起来很棒,冗余更少。我很想知道这两个版本中的哪一个更好

+----+   +----+-------+
| ID |   | ID | Group |
+----+   +----+-------+
| 1  |   | 1  |  gr1  |
| 1  |   | 1  |  gr2  |
| 2  |   | 2  |  gr2  |
| 2  |   | 2  |  gr3  |
+----+   +----+-------+
SELECT * FROM tbl1 join tbl2 USING(ID) WHERE Group="gr1";

+----+-----------+
| ID | Group     |
+----+-----------+
| 1  |  gr1,gr2  |
| 2  |  gr2,gr3  |
+----+-----------+
SELECT * FROM tbl1 WHERE Group REGEXP '(^|,)gr1($|,)';

只要你有小桌子,你可以随意使用

如果你希望表格增长,你真的需要选择第一选择。背后的原因是使用
where regexp
的查询将不会使用索引。正如您所知,索引是快速查询的关键。
如果使用InnoDB,请定义一个链接两个表的外键

你说,你发现第一个选择比第二个有更多的冗余。对我来说似乎不是。考虑到这一点,你的草图可能表明存在误解。它应该是这样的,即表1中每个id只有一行,因此没有冗余

      Tbl1                Tbl2
+----+----------+   +----+-------+
| ID |Other cols|   | ID | Group |
+----+----------+   +----+-------+
| 1  |          |   | 1  |  gr1  |
| 2  |          |   | 1  |  gr2  |
+----+----------+   | 2  |  gr2  |
                    | 2  |  gr3  |
                    +----+-------+