mysql - 加入动态表时是否使用索引?
问题描述
SELECT term, ...
FROM tbl INNER JOIN
(SELECT 'constant 1' AS term
UNION
SELECT 'constant x' AS term) AS T USING (term)
WHERE ...
tbl 中的术语列上有一个索引。
假设联合是数千长,性能是否会因为常量是凭空指定的,还是因为它存在于 tbl 中而使用索引?
解决方案
让我们看看怎么EXPLAIN SELECT ...;
说。如果正在使用任何索引,它将说明哪个。
但这并不能回答“真正的”问题——如何加快查询速度。
对于表,就目前而言,最佳索引
tbl
是任何以.开头term
的索引。UNION
与 相同UNION DISTINCT
,它收集行,然后对结果进行重复数据删除。我怀疑你不需要de-dup?然后将它们更改为UNION ALL
.什么版本的MySQL?在旧版本中,
UNION
总是创建一个临时表。在较新的版本中UNION ALL
,您可能有资格跳过临时表。(但我不确定您拥有的“派生”表。)同样,这EXPLAIN
将有助于确定这一点。EXPLAIN FORMAT=JSON SELECT ...
如果有数千个项目,请修剪它。可能有更好的方法!
SELECT term, ... FROM tbl INNER JOIN WHERE term IN('constant 1', 'constant x', ...) AND ...
- 可能还有更多优化,但我们需要查看
SHOW CREATE TABLE
,以及查询的其余部分。(仅对常数进行采样就足够了,但其他椭圆可能包含有用的秘密。)
推荐阅读
- office-js - addFileAttachmentAsync 附加无效的授权标头
- html - html视频播放问题
- c# - 如何检查 DataGrid 中的特定列是否已更改?
- c# - PostMessage 鼠标点击有效但没有移动
- c# - 如何压缩相同的重复 Else If 语句
- python - 尝试对 pandas df 进行排序返回多索引错误
- api - 使用 Postman 到负载均衡器进行 API 测试
- github - 每次重新打开 git bash: git@github.com: Permission denied (publickey)
- java - Java 服务层方法 - 主键或休眠实体参数?如果使用 Spring Boot,哪个更惯用?
- javascript - 同时更新firebase中的数组