我需要优化搜索的性能与许多字符串喜欢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相关问答推荐

按与WooCommerce管理顺序列表中的特定字符串不匹配的特定元值筛选订单

免费送货柜台,考虑到折扣码

针对给定产品类别的WooCommerce计数审核

上传WordPress模板中的翻译文件(.mo和.po)

如何使用PHP从TXM(XML)标记中读取特定属性

有没有办法获取触发流操作的页面的 URI?

在 Heroku 上部署 Sylius - 路由不正确

注册命名空间后如何获取xml node 值?

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

如何使用在产品快速编辑菜单前端的自定义框中 Select 的值更新 woocommerce 产品属性值?

htaccess php 文件,然后是文件夹

如何更改或管理Carbon时区,使其不会来回移动时钟

Laravel Websockets 错误:(WebSocket 在建立连接之前关闭)

从 d-m-Y 日期格式 laravel 计算月份 = 01 的列的总和

无法按今天加上 7 天显示数据库项目

从mysql输出json指定数据

Laravel updateOrCreate 方法 - 更新你匹配的同一列

stream_get_line 如何设置它开始读取文件的位置?

无法从 json 文件中解码字符串

当 URL 包含/ /时,自定义错误页面未加载