【发布时间】:2022-01-23 02:14:06
【问题描述】:
我有一张这样的桌子。
parent VARCHAR PK
priority INT PK
child VARCHAR
现在我需要选择/计数,对于春季分页,那些孩子超过指定数量的人。
我的问题来了。
-- SELECT
SELECT
parent,
GROUP_CONCAT(child ORDER BY priority SEPARATOR 0x1D) AS concatenated_children,
COUNT(child) AS child_count
FROM mytable
GROUP BY parent
HAVING child_count >= ?1
ORDER BY parent ASC
LIMIT 2048,? -- GETTING SLOWER when the OFFSET is increases
-- COUNT
SELECT COUNT(wrk.parent)
FROM (SELECT parent, COUNT(child) AS child_count
FROM mytable
GROUP BY parent
HAVING child_count >= ?1) AS wrk
?1 部分是常量(8),偏移部分(,?)是每分页增加。
问题是随着页码的增加,选择查询变慢了。
?size=2048,page=0 took 60 ms
?size=2048,page=100 took 2646 ms
我该如何解决这个问题?
CREATE TABLE `mytable` (
`parent` varchar(100) NOT NULL,
`child` varchar(255) NOT NULL,
`priority` int(11) NOT NULL,
PRIMARY KEY (`parent`,`priority`)
)
parent child priority
---------------------------------
NIKE Air Max 1
NIKE Air Jordan 2
WATCH Patek Philippe 1
WATCH Rolex 2
标准
Select all parents (and its children)
which each has at least some number children, say 8.
【问题讨论】:
-
SHOW CREATE TABLE table_name;显示了有关表结构的更多信息,因此如果您可以发布它们会有所帮助。如果您能提供查询的执行计划,也会有所帮助。 -
@FanoFN 已更新。
-
"PRIMARY KEY (
parent,priority)" -- 这允许一个父母多次出现;真的是这样吗? -
@RickJames 是的,我相信。同一个
parent中的那些孩子(child)应该按唯一的priority排序。 -
@JinKwon - 如果您通过 Offset 转储整个表格,则需要读取 100*51“页”。通过“记住你离开的地方”倾倒只需要 100 页。看我的回答。
标签: mysql sql pagination