gpt4 book ai didi

php - Laravel 尝试查询多个表

转载 作者:可可西里 更新时间:2023-11-01 09:00:25 26 4
gpt4 key购买 nike

不太确定如何解决这个问题,如果这甚至是我的查询或数据库的问题,那么就这样吧。有 3 个表,产品,关系和标签。

'products' (
'ID' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
'user_id' bigint(20) unsigned NOT NULL,
'name' varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'primary_image' bigint(20) DEFAULT NULL,
'description' longtext COLLATE utf8mb4_unicode_ci,
'price' float DEFAULT NULL,
'sale_price' float DEFAULT NULL,
'currency' varchar(25) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'primary_color' varchar(7) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'secondary_color' varchar(7) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'status' varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'quantity' bigint(20) DEFAULT NULL,
'origin' varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'type' varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'size' varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'processing_time' varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
'date_added' int(11) DEFAULT NULL,
PRIMARY KEY ('ID')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

'relations' (
'ID' bigint(20) unsigned NOT NULL,
'relation_id' bigint(20) unsigned NOT NULL,
'type' varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
'options' text COLLATE utf8mb4_unicode_ci,
KEY 'ID' ('ID'),
KEY 'relation_id' ('relation_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

'tags' (
'ID' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
'name' varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
'slug' varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY ('ID')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这些类别之间的关系如下:

  • products.ID = relations.ID
  • relations.relation_id = tags.ID

数据库中添加了 5 万个产品、25 万个关系和 2.5 万个标签以供测试。

我正在构建一个在产品名称、描述和标签中进行搜索的查询。

执行此查询:

Product::select('ID', 'name')->where( 'name', 'like', '%'.$search_query.'%' )->orWhere( 'description', 'like', '%'.$search_query.'%' )->orWhereHas('relations', function( $query ) use( $search_query ) {
$query->where('type', 'tags')->whereHas('tags', function( $query ) use( $search_query ) {
$query->where( 'name', 'like', '%'.$search_query.'%' );
});
})->paginate(25);
  • 这个查询大约需要 0.8s 来找到数据,如果我查询一个特定的标签,它只需要 1.8s
  • 我用连接构建了一个类似的查询,但它花费了更长的时间,所以我现在继续使用上面的查询。

你们中有人知道我可能做错了什么吗?这里的主要问题是查询执行时间。

最佳答案

据我所知,没有办法优化这个查询。如果您有 'LIKE', searchquery.'%'(没有前导 %),您可以索引文本列以提高速度。如果您需要两端都带有通配符的此功能,则必须使用全文索引搜索提供程序。 Algolia https://www.algolia.com/是我所知道的,Laravel Scout 是为与他们的搜索一起工作而创建的。这other question还引用了 http://sphinxsearch.com/http://lucene.apache.org/core/虽然我不知道他们做什么。

编辑:还有https://www.elastic.co/products/elasticsearch

关于php - Laravel 尝试查询多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45379240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com