我有一个数据库,其中的表至少有5亿条记录,在表(urldata)中我有url和描述列,我需要按url进行查询并返回存在此url的所有行,但是有是一个问题 假设数据库具有以下 url:
https://website.com
www.website.com
sub.website.com
https://website.com/App
我搜索“website.com”,我希望它返回所有出现的情况,因为它们都是同一个网站,但写法不同,所以我使用 like
这是数据库模型,我使用的是sqlalchemy和sqlite3
class File(db.Model):
__tablename__ = 'files'
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(255), unique=True, nullable=False)
size = db.Column(db.String(255), nullable=False)
class UrlData(db.Model):
__tablename__ = 'urldata'
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(255), nullable=False)
description = db.Column(db.String(255), nullable=False)
filename = db.Column(db.String(255), db.ForeignKey('files.filename'), nullable=False)
file = db.relationship('File')
问题基本上如下,在数据库中进行一个简单的查询,返回400条结果,平均需要20多秒,这是很多时间,我知道必须有一种方法可以大大减少这个,使查询我正在使用这个:
UrlData.query.filter(UrlData.url.contains(query)).all()
我的尝试是对 url 列建立索引,但这花费了很多时间,很多小时,最后它损坏了数据库,此外,这个数据库每天都会收到数千到数百万的新行,我认为这是不可行的必须索引所有内容
问题基本上如下,在数据库中进行简单的查询, 返回 400 个结果,平均耗时超过 20 秒, 时间很长
这是因为您的查询对表进行了全面扫描。 您只能通过索引来加快字符串搜索速度。
在 postgress 的情况下,有 trigram 杜松子酒索引
create index url_trgm_idx
on url_data using gin (url gin_trgm_ops);
create index url_trgm_idx
on <TABLE NAME> using gin (<COLUMN NAME> gin_trgm_ops);
该索引将加快查询速度,例如
select *
from url_data
where url ilike '%tdi%'
或者您可以使用带有特殊索引的elasticsearch(或其他数据库)进行文本搜索。