2009-06-25 53 views
2

我试图创建一个更快的查询,现在我有大型数据库。我的表格大小是5列,530k行,300列,4k列(可惜我对建筑有0控制,否则我不会在可怜的数据库中出现这个愚蠢的问题)。创建更快的MySQL查询

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 

我索引与foo_20沿table2.foo_0和table1.foo_0,希望这将允许更快的查询..我还在近7第二负载时间..有别的东西,我可以做?

干杯

+0

300列...? – 2009-06-25 16:38:58

+0

就像我说的,0控制,并且是可怕的架构:( – Petrogad 2009-06-25 16:39:32

回答

3

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

0

table2需要在foo_0foo_20,和bar1一个复合索引。

1

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

总的来说,粘贴前面输入的EXPLAIN可能会给出一些提示。

0

假设foo_20属于table1,table1.foo_0, table1.bar1上的索引也可以提供帮助。

参见How to use MySQL indexesOptimizing queries with explain

使用与您的WHERE等号(通常是最左上角的col)相对应的复合索引,WHERE与abolute值(中)进行比较,以及ORDER BY子句(右,以相同顺序)。

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更严格的筛选。

我对这个博客文章:

,该通知:关于如何选择创建这样的情况下,其指数。