我需要优化搜索的性能与许多字符串喜欢Z1719121.

我的表 struct :

codfabrica  => varchar 191 => nullable
codoriginal => varchar 191 => nullable
aplicacao   => mediumText  => nullable

表索引:

codfabrica  => non_unique 1 | seq_in_index 1 | collation A    | cardinality 42466
codoriginal => non_unique 1 | seq_in_index 1 | collation A    | cardinality 7449
aplicacao   => non_unique 1 | seq_in_index 1 | collation NULL | cardinality 42550

LALAVEL查询代码:

$allKeys = [...]; // array with lots of strings
$q = MyModel::query();
$q->whereIn('codfabrica', $allKeys);
$q->orWhereIn('codoriginal', $allKeys);
$q->orWhereRaw('MATCH (aplicacao) AGAINST (?)', array($allKeys));

结果:

array with 1000 strings => took 5 seconds
array with 2500 strings => took 35 seconds

有什么方法可以优化这个搜索吗?

我没有经验与索引,所以我创建索引正确的方式?

该表当前有42.000 rows个和20mb total size个,托管在AWS db.t3.small个RDS服务器(2个vCPU、2 GiB内存)上.

推荐答案

MySQL或多或少限制为在给定查询中每个表引用一个索引.您在搜索中使用了OR个术语,其中任何一个都将使用索引,但其他术语则不能.所以查询必须进行表扫描.

您可以通过查询表三次来解决这个问题,每次查询表都有不同的搜索词,该搜索将使用最好的索引.这被视为三个不同的表引用,因此可以 for each case 使用不同的索引.

然后是UNION个结果.

SELECT ... FROM MyModel WHERE codfabrica IN (...)
UNION
SELECT ... FROM MyModel WHERE codoriginal IN (...)
UNION
SELECT ... FROM MyModel WHERE MATCH (aplicacao) AGAINST (...)

我不使用Laravel查询构建器,但它似乎支持UNION.阅读https://laravel.com/docs/10.x/queries#unions个例子.

另外,我认为不能将数组传递给MATCH()/AGAINST().我建议您阅读有关全文搜索表达式的内容.

Php相关问答推荐

在不刷新页面的情况下无法使用JQuery更新id

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

使用WooCommerce本机产品短码时不考虑价格筛选(_SHORT CODE)

Laravel迁移返回SQL错误,但SQL有效且工作正常

我如何知道BaseController中当前运行的是哪个控制器?

Mysqli_stmt::Execute():结果字段元数据中存在过早的EOF

LaravelEloquent 地根据表中的值提取记录

根据未用于变体的产品属性隐藏WooCommerce发货方式

从WooCommerce订单状态更改更新用户自定义元数据

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

将日期数组排序为年->;月

是否重新排序多维数组元素以将所有子数组中的子数组移动到元素列表的底部?

从字符串转换日期和/或时间时,Laravel转换失败

WooCommerce产品页面上没有产品详细信息

Shopware 6 插件:如何删除布尔配置并将其迁移到多选配置

调用未定义的方法 mysqli::execute_query()

在特征中使用类的属性

如何将数字文本文件添加到 PHP 数学方程式中?

在 DomPDF 和 Laravel 中使用内联 css

我想更新表格中的结果并将它们发布到浏览器,但它不起作用