首页 > 解决方案 > 加入动态表时是否使用索引?

问题描述

SELECT term, ...
  FROM tbl INNER JOIN
       (SELECT 'constant 1' AS term
         UNION
        SELECT 'constant x' AS term) AS T USING (term)
 WHERE ...

tbl 中的术语列上有一个索引。

假设联合是数千长,性能是否会因为常量是凭空指定的,还是因为它存在于 tbl 中而使用索引?

标签: mysqlsql

解决方案


让我们看看怎么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,以及查询的其余部分。(仅对常数进行采样就足够了,但其他椭圆可能包含有用的秘密。)

推荐阅读