正则表达式加入性能Mysql

Akx*_*kxe 3 regex mysql performance

我犹豫什么应该使用哪种类型.会有很多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($|,)';
Run Code Online (Sandbox Code Playgroud)

Lor*_*yer 5

只要您有小桌子,您可以自行决定使用两者.

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

你说,你发现第一选择的冗余比第二选择更多.它似乎不适合我.想一想你的草图可能会表明存在误解.它应该看起来像这样,即表1中每个id只有一行,因此没有冗余.

      Tbl1                Tbl2
+----+----------+   +----+-------+
| ID |Other cols|   | ID | Group |
+----+----------+   +----+-------+
| 1  |          |   | 1  |  gr1  |
| 2  |          |   | 1  |  gr2  |
+----+----------+   | 2  |  gr2  |
                    | 2  |  gr3  |
                    +----+-------+
Run Code Online (Sandbox Code Playgroud)