0

我做的这个查询是有效的,但它有点慢,我最后一次插入它超过 30,000 条记录,我猜我必须等待大约一两个小时。我使用的有点奇怪,这是一个进入数据库ReactJS的前端POST,但它正在工作,所以我对此没有任何抱怨......

但是我已经删除了该表并创建了一个新表,但是这次由于更新了一些内容,我有超过 50,000 条记录。

这就是我的表在 Supabase 中的工作方式

ID 动漫标题 日本动漫剧集 动漫视频 动漫视频
1 电影名 A 第1集 URL-movieA-1 无效的
2 电影名 A 第 2 集 URL-movieA-2 无效的
3 电影名 A 第 3 集 URL-movieA-3 无效的
4 电影名称 B 第1集 URL-电影B-1 无效的
5 电影名称 B 第 2 集 URL-电影B-2 无效的
6 电影名称 B 第 3 集 URL-电影B-3 无效的
7 影片名称 C 第1集 URL-movieC-1 无效的
8 影片名称 C 第 2 集 URL-movieC-2 无效的
9 影片名称 C 第 3 集 URL-movieC-3 无效的

所以anime_titleis 是另一个表的外键, 1anime_title可以包含很多anime_episodeanime_videois null,请不要打扰它,它用于稍后填充数据,我已经成功了。

我的问题是,如果有超过 50,000 条记录,插入将需要很长时间。但我不太熟悉如何使用数据库,所以我的方式似乎......有点“简单”。

我的代码如何运行:它选择anime_title, anime_url,anime_episode以查看它是否在我的 supabase 数据库中匹配,如果这data.length === 0意味着它在我的数据库中为空,我将继续插入它,如果不是,我将跳过它。但是数据库越大,查询进行的时间就越长。

这是我的代码:

import './index.css'
import { useEffect } from 'react'
import { supabase } from './supabaseClient'
import animeData from './data.json'
import animeDataEpisode from './dataEpisode.json'

export default function App() {

useEffect(async () => {
// POST Anime Episode Based on Anime Title

for(let i = 0; i < animeDataEpisode.length; i++){
  const {data, error} = await supabase
  .from('anime_detail')
  .select('anime_title, anime_url, anime_episode')
  .match({
    anime_title: animeDataEpisode[i].animeTitle, 
    anime_url: animeDataEpisode[i].animeEpisodeUrl, 
    anime_episode: animeDataEpisode[i].animeEpisode
  })

  if(data.length === 0){
    await supabase
    .from('anime_detail')
    .insert([{
      anime_title: animeDataEpisode[i].animeTitle,
      anime_url: animeDataEpisode[i].animeEpisodeUrl, 
      anime_episode: animeDataEpisode[i].animeEpisode
    }])
  }
  else(
    console.log("Record already exist, no INSERT")
  )
}
},[])

  return (
    <div className="container">
    </div>
  );
}
4

1 回答 1

0

其他人已经指出您当前的方法很奇怪,所以我假设您有这样做的理由并相应地回答:

您遇到的问题是用 30,000 - 50,000 条记录填充数据库需要很长时间。

这么多记录听起来像是大量数据的初始化加载,听起来不像是您需要经常做的事情。

因此,您正在尝试优化使用初始数据集填充数据库所需的时间。

以下是您可能会考虑进行优化的一些事项:

在插入之前清理数据以删除重复项。无论如何,数据清理都是一个好主意——这一步可以让您很好地了解数据的整体性质,并让您有机会删除(可能)不需要的东西,如空值和重复值。为了清理你的数据,我个人会使用 python 和pandas打开它,它们很容易用于基本的数据检查和清理步骤。

注释掉你的 useEffect 代码的查找/比较部分。由于您清理了数据,因此不会有任何重复。

如果您不想清理数据以删除重复项并希望保留匹配检查代码,那么我建议您在代码中寻找瓶颈。据我所知,插入大量数据不应该花费数小时。这对我来说是一个瓶颈。

我不确定您的数据结构如何,但这里有一个显着改进的示例:

当您尝试将某个情节与数据库中的现有情节进行匹配时,它可能会对您的数据库中的每个情节进行范围查询并每次检查字段。这是一个非常糟糕的扩展事情,因为您每次都需要检查 N 条现有记录,并且 N 条正在增长。

相反,您应该能够在恒定时间内进行基于散列的相等性查找,因为您只是试图找到完全匹配。在不知道 supabase 如何在后台工作的情况下,我很难推荐从哪里开始,但也许您可以尝试使用is过滤器而不是match过滤器来尝试强制执行更有效的相等搜索。

于 2022-01-05T15:29:57.973 回答