创建更快的MySQL查询

时间:2009-06-25 16:36:05

标签: sql performance mysql

我正在尝试创建更快的查询,现在我有大型数据库。我的表大小是5 col,530k行,300 col,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秒的加载时间..我还能做些什么吗? / p>

干杯

5 个答案:

答案 0 :(得分:3)

我认为bar1上的索引是关键。我总是遇到日期的性能问题,因为它必须比较每个530K行。

答案 1 :(得分:2)

创建以下索引:

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进行更严格的过滤。

我有一篇博文:

,建议如何选择为这种情况创建索引。

答案 2 :(得分:1)

索引table1.bar1可能会改善> = NOW比较。 table2.foo_0table2.foo_20上的复合索引会有所帮助。 table2.foo_1上的索引可能有助于排序。

总体而言,粘贴前缀为EXPLAIN的查询输出也可能会给出一些提示。

答案 3 :(得分:0)

table2需要foo_0foo_20bar1上的复合索引。

答案 4 :(得分:0)

假设foo_20属于table1,table1.foo_0, table1.bar1上的索引也会有所帮助。

请参阅How to use MySQL indexesOptimizing queries with explain

使用与WHERE相等对应的复合索引(通常在索引中最左边的col),WHERE与abolute值(中间)比较,以及ORDER BY子句(右,以相同的顺序)。