提高LIKE查询速度

问题描述 投票:0回答:1

我有一个数据库,其中的表至少有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 列建立索引,但这花费了很多时间,很多小时,最后它损坏了数据库,此外,这个数据库每天都会收到数千到数百万的新行,我认为这是不可行的必须索引所有内容

python sqlite optimization sqlalchemy bigdata
1个回答
0
投票

问题基本上如下,在数据库中进行简单的查询, 返回 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(或其他数据库)进行文本搜索。

© www.soinside.com 2019 - 2024. All rights reserved.