mysql - 慢 Group_concat 查询

标签 mysql

我试图创建一个规范化的数据库。因此,我试图加入 21 个表。正如下面 EXPLAIN 语句的屏幕截图所示,我在连接中的几乎所有表上都使用了索引。

http://i.imgur.com/V5hQu.png

所有 lookup_xxxxx 表在 2 列(content_id 和 xxxxxx_id)上有一个索引 所有 xxxxxx 表在 1 列 (xxxxx_id) 上有一个索引

我在每个表中只有大约 10 行左右。我看到的问题是这两个 goup_concat 将查询额外延长了 200 毫秒。我允许提交字段、peripheralprogramming language 有多个值。没有它们,查询不到 80 毫秒。 我的问题是我是否应该取消 group_concats 并为它们做单独的查询或重建我的数据库。

lookup_xxxxx 表存储每个允许值,然后其他表(例如 peripheral)通过 content_id 将提交链接到允许值。一切都引用提交 content_idcontent 表包含基本信息,例如成员(member) ID、姓名等。

如果我的帖子不够清晰,我深表歉意。

mysql> describe peripheral;
+------------------+----------+------+-----+---------+-------+
| Field            | Type     | Null | Key | Default | Extra |
+------------------+----------+------+-----+---------+-------+
| peripheral_id    | int(2)   | NO   | PRI | NULL    |       |
| peripheral       | char(30) | NO   |     | NULL    |       |
| peripheral_total | int(5)   | NO   |     | NULL    |       |
+------------------+----------+------+-----+---------+-------+

mysql> select * from peripheral;
+---------------+-----------------+------------------+
| peripheral_id | peripheral      | peripheral_total |
+---------------+-----------------+------------------+
|             1 | periph 1        |                0 |
|             2 | periph 2        |                1 |
|             3 | periph 3        |                3 |
+---------------+-----------------+------------------+

:

mysql> describe lookup_peripheral;
+---------------+---------+------+-----+---------+-------+
| Field         | Type    | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| content_id    | int(10) | NO   | MUL | NULL    |       |
| peripheral_id | int(2)  | NO   |     | NULL    |       |
+---------------+---------+------+-----+---------+-------+  


mysql> mysql> select * from lookup_peripheral;
+------------+---------------+
| content_id | peripheral_id |
+------------+---------------+
|         74 |             2 |
|         74 |             5 |
|         75 |             2 |
|         75 |             5 |
|         76 |             3 |
|         76 |             4 |
+------------+---------------+

SELECT group_concat(DISTINCT peripheral.peripheral_id) as peripheral_id, group_concat(DISTINCT programming_language.programming_language_id) as programming_language_id, c.member_name, c.member_id, c.added_date_time, c.title, c.raw_summary, c.raw_all_content, c.meta_tags, c.main_pic_thumb, application.application_id, architecture.architecture_id, compiler.compiler_id, device_family.device_family_id, difficulty.difficulty_id, ide.ide_id, programmer.programmer_id, table_name.table_name_id, device_name.device_name
FROM (content as c)
INNER JOIN lookup_peripheral ON 76 = lookup_peripheral.content_id
INNER JOIN peripheral ON peripheral.peripheral_id = lookup_peripheral.peripheral_id
INNER JOIN lookup_programming_language ON 76 = lookup_programming_language.content_id
INNER JOIN programming_language ON programming_language.programming_language_id = lookup_programming_language.programming_language_id
.......
LEFT OUTER JOIN device_name ON device_name.content_id = c.content_id
INNER JOIN table_name ON table_name.table_name_id = lookup_table_name.table_name_id
WHERE `c`.`content_id` = '76'  

最佳答案

我认为您还应该索引 lookup_peripheral.peripheral_id 字段。索引外键使 INNER JOIN 更快。此外,您是否真的需要 DISTINCT 子句,因为您正在连接 ID 字段? 再想一想,也许您可​​以省略 GROUP_CONCAT 和 INNER JOIN(我相信您的一些 JOIN 条件重叠,如果我弄错了请纠正我)

... (SELECT GROUP_CONCAT(l.peripheral_id) from lookup_peripheral lp where lp.content_id = 76) as peripheral_id, ...

希望这对您有所帮助。

关于mysql - 慢 Group_concat 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238781/

相关文章:

mysql - SQL 外键约束错误 1025 (152)

mysql - 如何使用 utf8mb4 在 MySQL 中按表情符号搜索?

php - 使用mysql和php查找存放数据的表名

mysql - 安装 xampp 并将其与现有 MySQL 服务器集成

java - 使用JDBC和MySQL解决“通信链接失败”问题

mysql - order by 和 group by 两者都在时间不工作

mysql - XAMPP 上的 Symfony 4 - make :migration does't work, 找不到驱动程序

php - 如何使用 mysql -php 根据其category_id 检索 woocommerce 产品详细信息

mysql - Windows mysql workbench无法连接远程mysql服务

mysql - 如何从变量数组生成准备好的 MySQL 查询?