我正在尝试创建更快的查询,现在我有大型数据库。我的表大小是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>
干杯
答案 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_0
和table2.foo_20
上的复合索引会有所帮助。
table2.foo_1
上的索引可能有助于排序。
总体而言,粘贴前缀为EXPLAIN
的查询输出也可能会给出一些提示。
答案 3 :(得分:0)
table2
需要foo_0
,foo_20
和bar1
上的复合索引。
答案 4 :(得分:0)
假设foo_20属于table1,table1.foo_0, table1.bar1
上的索引也会有所帮助。
请参阅How to use MySQL indexes和Optimizing queries with explain。
使用与WHERE相等对应的复合索引(通常在索引中最左边的col),WHERE与abolute值(中间)比较,以及ORDER BY子句(右,以相同的顺序)。