gpt4 book ai didi

mysql - 慢 Group_concat 查询

转载 作者:行者123 更新时间:2023-11-29 03:45:00 25 4
gpt4 key购买 nike

我试图创建一个规范化的数据库。因此,我试图加入 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com