MariaDB左连接忽略索引键:大表关联性能低下问题排查
1. 字符集不匹配导致索引失效
当关联查询涉及的字段所在表字符集不一致时(本地utf8mb4 vs 服务器utf8mb3),MariaDB执行关联比较时需要对其中一方的字段做字符集转换。转换后的字段值无法匹配原表基于utf8mb3创建的索引——因为索引的存储编码和转换后的编码不兼容,优化器只能选择全表扫描(type=ALL);而本地环境字符集一致,无需转换,可正常调用索引(type=ref)。
2. MariaDB版本间优化器行为差异
MariaDB 11.4相比10.6,优化器对字符集不匹配场景的判断逻辑更严格。10.6版本可能在部分字符集不匹配的情况下仍尝试复用索引,而11.4版本的优化器会直接判定转换后的字段无法利用索引,进而选择全表扫描的执行计划。
统一表字符集(最优方案):将服务器端
lei表的字符集修改为utf8mb4,与本地环境保持一致。执行以下SQL(操作前建议备份数据):ALTER TABLE lei CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;字符集统一后,关联字段无需转换,索引可正常被优化器选用,恢复
ref类型的执行计划。临时强制使用索引:若暂时无法修改字符集,可在查询语句中指定使用目标索引,强制优化器走索引扫描,示例:
SELECT ... FROM main_table mt JOIN lei FORCE INDEX(idx_关联字段名) ON mt.关联字段 = lei.关联字段 WHERE ...;此方案为临时 workaround,无法从根本解决字符集不匹配的问题。
更新表统计信息:执行
ANALYZE TABLE lei;,让优化器获取最新的表和索引统计数据,避免因统计信息过时导致错误的执行计划选择。核对优化器参数:对比本地与服务器端的
optimizer_switch参数设置,查看是否存在影响索引选择的参数差异(例如use_index_extensions、condition_fanout_filter等),确保服务器端参数配置与本地一致(若业务允许)。
内容的提问来源于stack exchange,提问作者Philipp M

