所以我在MySQL控制台中运行以下作为控制测试,看看是什么阻碍了我的查询速度.
SELECT bbva_deductions.ded_code, SUBSTRING_INDEX(bbva_deductions.employee_id, '-' , -1) AS tt_emplid,
bbva_job.paygroup, bbva_job.file_nbr, bbva_deductions.ded_amount
FROM bbva_deductions
LEFT JOIN bbva_job
ON CAST(SUBSTRING_INDEX(bbva_deductions.employee_id, '-' , -1) AS UNSIGNED) = bbva_job.emplid LIMIT 500
Run Code Online (Sandbox Code Playgroud)
它一直运行大约4秒钟.(似乎只有500行非常高).
简单地删除连接的CAST部分就减少了0.01秒......
为什么到现在这么慢?我在做什么来激怒MySQL神灵吗?
编辑:
这里要求的是EXPLAIN输出:

没有CAST:

EXPLAIN EXTENDED:

MySQL使用索引进行这些操作:
[ deletia ]
在您的情况下,您尝试连接子字符串(一个表中的字符串列)和另一个表中的字符串列之间的比较.索引可用于此操作,但是按字典顺序执行比较(即将操作数视为字符串,即使它们表示数字).
通过显式地将一侧转换为整数,比较以数字方式执行(根据需要) - 但这需要MySQL 隐式转换字符串列的类型,因此它无法使用该列的索引.
您已经遇到了这个路障,因为您的架构设计很差.您应该努力确保所有列:
使用与其内容最相关的数据类型进行编码; 和
只包含一条信息 - 请参阅在数据库列中存储分隔列表真的那么糟糕吗?
至少,你bbva_job.emplid应该是一个整数; 并且您bbva_deductions.employee_id应该拆分,以便它的部分存储在单独的(适当类型)列中.使用适当的索引,您的查询将具有更高的性能.
| 归档时间: |
|
| 查看次数: |
1640 次 |
| 最近记录: |