MariaDB (Synology) 上的 LIKE 查询的性能问题

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

我正在使用 Synology NAS 上托管的 MariaDB。我有一个大约需要 2.5 秒的查询,我想优化其执行时间。这是查询:

SELECT * FROM jobs WHERE job_number LIKE '%Y2506195%'

表格详情:

  • 表名称:jobs
  • 行数:约 1000 万行
  • 索引:应用于 job_number 的 BTree 索引。

当前观察:

  • 由于开头使用通配符 %,LIKE '%...%' 查询似乎没有有效地利用索引。

缓冲池配置问题:

  • innodb_buffer_pool_size 设置为默认值 16MB。

  • 我尝试通过修改配置文件将其增加到 150MB:

    /usr/local/mariadb10/etc/my.cnf
    

进行更改并使用 sudo 命令重新启动 MariaDB 服务器后,缓冲池大小仍显示为 16MB。

问题:

  1. 如何优化此 LIKE 查询以获得更好的性能?
  2. 为什么修改配置文件后innodb_buffer_pool_size没有反映变化?

如有任何意见或建议,我们将不胜感激!

performance mariadb innodb
1个回答
0
投票

正如 @akina 在他的评论中提到的,您当前的

LIKE
表达式不是 sargable,这意味着它不能使用任何索引:

SELECT * FROM jobs WHERE job_number LIKE '%Y2506195%';

您可能在这里考虑的一个选项是创建并维护一个计算列,当

job_number
包含
Y2506195
子字符串时,该计算列为 true,否则为 false。 要为本专栏添加种子,请使用此更新:

UPDATE jobs
SET job_flag = job_number LIKE '%Y2506195%';

然后索引该标志:

CREATE INDEX idx ON jobs (job_flag);

最后,您当前的查询现在变为:

SELECT * FROM jobs WHERE job_flag;

即使对于数百万条记录,此查询也应该非常快。

请注意,此方法的缺点是您需要为

job_number
维护一个附加列。 这意味着每当您执行插入或更新时,您都必须更新此计算列。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.