我正在使用 Synology NAS 上托管的 MariaDB。我有一个大约需要 2.5 秒的查询,我想优化其执行时间。这是查询:
SELECT * FROM jobs WHERE job_number LIKE '%Y2506195%'
表格详情:
当前观察:
缓冲池配置问题:
innodb_buffer_pool_size 设置为默认值 16MB。
我尝试通过修改配置文件将其增加到 150MB:
/usr/local/mariadb10/etc/my.cnf
进行更改并使用 sudo 命令重新启动 MariaDB 服务器后,缓冲池大小仍显示为 16MB。
问题:
如有任何意见或建议,我们将不胜感激!
正如 @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
维护一个附加列。 这意味着每当您执行插入或更新时,您都必须更新此计算列。