Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: index mechanism to enhance overall performance (halo-dev#6039)
#### What type of PR is this? /kind improvement /area core /milestone 2.17.x #### What this PR does / why we need it: 重构索引机制的查询和排序以提升整体性能 **how to test it?** 使用 postgre 数据库,初始化 Halo ,然后执行以下脚本创建 30w 文章数据进行测试: <details> <summary>点击展开查看 SQL</summary> ```sql DO $$ DECLARE i integer; postNameIndex integer; snapshotName varchar; totalRecords integer; BEGIN postNameIndex := 1; totalRecords := 300000; FOR i IN 1..3 LOOP INSERT INTO "public"."extensions" ("name", "data", "version") VALUES ( '/registry/content.halo.run/categories/category-'||i, convert_to( jsonb_build_object( 'spec', jsonb_build_object( 'displayName', '分类-'||i, 'slug', 'category-'||i, 'description', '测试分类', 'cover', '', 'template', '', 'priority', 0, 'children', '[]'::jsonb ), 'status', jsonb_build_object( 'permalink', '/categories/category-'||i, 'postCount', totalRecords, 'visiblePostCount', totalRecords ), 'apiVersion', 'content.halo.run/v1alpha1', 'kind', 'Category', 'metadata', jsonb_build_object( 'finalizers', jsonb_build_array('category-protection'), 'name', 'category-' || i, 'annotations', jsonb_build_object( 'content.halo.run/permalink-pattern', 'categories' ), 'version', 0, 'creationTimestamp', '2024-06-12T03:56:40.315592Z' ) )::text, 'UTF8'), 0 ); END LOOP; FOR i IN 1..3 LOOP INSERT INTO "public"."extensions" ("name", "data", "version") VALUES ( '/registry/content.halo.run/tags/tag-' || i, convert_to( jsonb_build_object( 'spec', jsonb_build_object( 'displayName', 'Halo tag ' || i, 'slug', 'tag-'||i, 'color', '#ffffff', 'cover', '' ), 'status', jsonb_build_object( 'permalink', '/tags/tag-' || i, 'visiblePostCount', totalRecords, 'postCount', totalRecords, 'observedVersion', 0 ), 'apiVersion', 'content.halo.run/v1alpha1', 'kind', 'Tag', 'metadata', jsonb_build_object( 'finalizers', jsonb_build_array('tag-protection'), 'name', 'tag-'||i, 'annotations', jsonb_build_object( 'content.halo.run/permalink-pattern', 'tags' ), 'version', 0, 'creationTimestamp', '2024-06-12T03:56:40.406407Z' ) )::text, 'UTF8'), 0); END LOOP; FOR i IN postNameIndex..totalRecords LOOP -- Generate snapshotName snapshotName := 'snapshot-' || i; -- Insert post data INSERT INTO "public"."extensions" ("name", "data", "version") VALUES ( '/registry/content.halo.run/posts/post-' || postNameIndex, convert_to( jsonb_build_object( 'spec', jsonb_build_object( 'title', 'title-' || postNameIndex, 'slug', 'slug-' || postNameIndex, 'releaseSnapshot', snapshotName, 'headSnapshot', snapshotName, 'baseSnapshot', snapshotName, 'owner', 'admin', 'template', '', 'cover', '', 'deleted', false, 'publish', true, 'pinned', false, 'allowComment', true, 'visible', 'PUBLIC', 'priority', 0, 'excerpt', jsonb_build_object( 'autoGenerate', true, 'raw', '' ), 'categories', ARRAY['category-kEvDb', 'category-XcRVk', 'category-adca'], 'tags', ARRAY['tag-RtKos', 'tag-vEsTR', 'tag-UBKCc'], 'htmlMetas', '[]'::jsonb ), 'status', jsonb_build_object( 'phase', 'PUBLISHED', 'conditions', ARRAY[ jsonb_build_object( 'type', 'PUBLISHED', 'status', 'TRUE', 'lastTransitionTime', '2024-06-11T10:16:15.617748Z', 'message', 'Post published successfully.', 'reason', 'Published' ), jsonb_build_object( 'type', 'DRAFT', 'status', 'TRUE', 'lastTransitionTime', '2024-06-11T10:16:15.457668Z', 'message', 'Drafted post successfully.', 'reason', 'DraftedSuccessfully' ) ], 'permalink', '/archives/slug-' || postNameIndex, 'excerpt', '如果你看到了这一篇文章,那么证明你已经安装成功了,感谢使用 Halo 进行创作,希望能够使用愉快。', 'inProgress', false, 'contributors', ARRAY['admin'], 'lastModifyTime', '2024-06-11T10:16:15.421467Z', 'observedVersion', 0 ), 'apiVersion', 'content.halo.run/v1alpha1', 'kind', 'Post', 'metadata', jsonb_build_object( 'finalizers', ARRAY['post-protection'], 'name', 'post-' || postNameIndex, 'labels', jsonb_build_object( 'content.halo.run/published', 'true', 'content.halo.run/deleted', 'false', 'content.halo.run/owner', 'admin', 'content.halo.run/visible', 'PUBLIC', 'content.halo.run/archive-year', '2024', 'content.halo.run/archive-month', '06', 'content.halo.run/archive-day', '11' ), 'annotations', jsonb_build_object( 'content.halo.run/permalink-pattern', '/archives/{slug}', 'content.halo.run/last-released-snapshot', snapshotName, 'checksum/config', '73e40d4115f5a7d1e74fcc9228861c53d2ef60468e1e606e367b01efef339309' ), 'version', 0, 'creationTimestamp', '2024-06-11T05:51:46.059292Z' ) )::text, 'UTF8'), 1 ); -- Insert content data INSERT INTO "public"."extensions" ("name", "data", "version") VALUES ( '/registry/content.halo.run/snapshots/' || snapshotName, convert_to( jsonb_build_object( 'spec', jsonb_build_object( 'subjectRef', jsonb_build_object( 'group', 'content.halo.run', 'version', 'v1alpha1', 'kind', 'Post', 'name', 'post-' || postNameIndex ), 'rawType', 'HTML', 'rawPatch', '<p style=\"\">测试内容</p>', 'contentPatch', '<p style=\"\">测试内容</p>', 'lastModifyTime', '2024-06-11T06:01:25.748755Z', 'owner', 'admin', 'contributors', ARRAY['admin'] ), 'apiVersion', 'content.halo.run/v1alpha1', 'kind', 'Snapshot', 'metadata', jsonb_build_object( 'name', snapshotName, 'annotations', jsonb_build_object( 'content.halo.run/keep-raw', 'true' ), 'creationTimestamp', '2024-06-11T06:01:25.748925Z' ) )::text, 'UTF8'), 1 ); postNameIndex := postNameIndex + 1; END LOOP; END $$; ``` </details> 使用以下 API 查询文章 ``` curl 'http://localhost:8090/apis/api.console.halo.run/v1alpha1/posts?page=1&size=20&labelSelector=content.halo.run%2Fdeleted%3Dfalse&labelSelector=content.halo.run%2Fpublished%3Dtrue&fieldSelector=spec.categories%3Dcategory-1&fieldSelector=spec.tags%3Dc33ceabb-d8f1-4711-8991-bb8f5c92ad7c&fieldSelector=status.contributors%3Dadmin&fieldSelector=spec.visible%3DPUBLIC' \ --header 'Authorization: Basic YWRtaW46YWRtaW4=' ``` Before: ![SCR-20240612-o20](https://github.com/halo-dev/halo/assets/38999863/fc27a265-6571-4361-a707-a683ea040837) After: ![SCR-20240612-q1c](https://github.com/halo-dev/halo/assets/38999863/c0a241b8-5ed4-4973-8dfc-c260ffccd727) #### Does this PR introduce a user-facing change? ```release-note 重构索引机制的查询和排序使整体性能提升 50% 以上 ```
- Loading branch information