代码之家  ›  专栏  ›  技术社区  ›  Petrogad

创建更快的MySQL查询

  •  2
  • Petrogad  · 技术社区  · 16 年前

    我正在尝试创建一个更快的查询,现在我有大型数据库。我的表大小是5列、530K行和300列、4K行(遗憾的是,我对体系结构的控制为0,否则我就不会对糟糕的DB有这个愚蠢的问题)。

    SELECT  cast( table2.foo_1 AS datetime ) as date,
            table1.*, table2.foo_2, foo_3, foo_4, foo_5, foo_6, foo_7, foo_8, foo_9, foo_10, foo_11, foo_12, foo_13, foo_14, foo_15, foo_16, foo_17, foo_18, foo_19, foo_20, foo_21
    FROM    table1, table2
    WHERE   table2.foo_0 = table1.foo_0
            AND table1.bar1 >= NOW()
            AND foo_20="tada"
    ORDER BY
            date desc
    LIMIT   0,10
    

    我已经索引了table2.foo_0和table1.foo_0以及foo_20,希望它能够允许更快的查询。我仍然在接近7秒的加载时间。还有什么我能做的吗?

    干杯

    5 回复  |  直到 16 年前
        1
  •  3
  •   northpole    16 年前

    我认为Bar1上的索引是关键。我总是遇到日期方面的性能问题,因为它必须比较53万行中的每一行。

        2
  •  2
  •   Quassnoi    16 年前

    创建以下索引:

    CREATE INDEX ix_table1_0_1 ON table1 (foo_1, foo_0)
    CREATE INDEX ix_table2_20_0 ON table2 (foo_20, foo_0)
    

    并将查询重写为:

    SELECT  cast( table2.foo_1 AS datetime ) as date,
            table1.*, table2.foo_2, foo_3, foo_4, foo_5, foo_6, foo_7, foo_8, foo_9, foo_10, foo_11, foo_12, foo_13, foo_14, foo_15, foo_16, foo_17, foo_18, foo_19, foo_20, foo_21
    FROM    table1
    JOIN    table2
    ON      table2.foo_0 = table1.foo_0
            AND table2.foo_20 = "tada"
    WHERE   table1.bar1 >= NOW()
    ORDER BY
            table1.foo_1 DESC
    LIMIT   0, 10
    

    第一个索引将用于 ORDER BY ,第二个将用于 JOIN .

    不过,创建这样的第一个索引可能会使您受益更多:

    CREATE INDEX ix_table1_0_1 ON table1 (bar, foo_0)
    

    这可能会对 bar .

    我有一篇关于这个的博客:

    关于如何为类似的情况选择要创建的索引的建议。

        3
  •  1
  •   Jon Bright    16 年前

    标引 table1.bar1 可以改进>=现在比较。 上的复合索引 table2.foo_0 table2.foo_20 会有帮助的。 一个索引 table2.foo_1 可能会有帮助。

    总的来说,将查询的输出粘贴到 EXPLAIN 预先准备的也可能会给出一些提示。

        4
  •  0
  •   chaos    16 年前

    table2 需要上的复合索引 foo_0 , foo_20 bar1 .

        5
  •  0
  •   instanceof me    16 年前

    一个索引 table1.foo_0, table1.bar1 如果foo_20属于表1,也会有所帮助。

    How to use MySQL indexes Optimizing queries with explain .

    使用与Where Equalities(通常是索引中最左边的一列)对应的复合索引,其中commparison表示abolute值(中间),order by子句(right,按相同顺序)。