2016-11-02 99 views
1

我正在为我的高流量网站优化一个mysql表,我有一个关于mysql索引的问题。首先一些信息:MySQL索引最佳性能

该表有273382行。

查询是:

SELECT table1.field1, table1.field2, table2.field2 
FROM table1 
LEFT JOIN table2 ON table1.idfield = table2.idfield 
WHERE table1.field = 1 AND table1.field2 = 'yes' 
ORDER BY table1.id DESC 
LIMIT 0,25 

我有以下指标:

index for table1.id - primary unique index 
index for table1.idfield - index 
index for table2.idfield - index 
index for (table1.field,table1.field2) - index 

通过上述指标的查询需要1.5至2.5秒即可完成

EXPLAIN EXTENDED说,正在使用主键(table1.id),我试过unique/index(table1.field,table1.field2,table1.id),结果类似(即使它使用了这个索引)。

在索引更改过程中(大约需要1分钟),查询变得快得多0.009。一旦更改过程完成,查询就会回到1.5-2.5s(大部分低于2)的速度。

我的问题是:哪个索引对这个查询最有效,以及为什么查询在更改索引时速度更快。

+0

一般经验法则:在决策环境中使用的任何字段('where,'join,等等)都应该有一个索引。并注意只是有一个索引并不意味着它会随时使用。 mysql可能会决定全表扫描比使用索引更有效。 –

+0

我意识到了这一点,并且我在连接和字段的位置都有索引,但查询仍然很慢。但是在更改过程中,查询运行速度要快得多,为什么?我怎样才能使这个查询运行速度与它被修改时一样快。 –

+0

尝试将table1.field和table1.field2列添加到索引中。它可能有助于您的表现。 – reza

回答

1

如果超过20%的表格有table1.field = 1 AND table1.field2 = 'yes',那么优化器会决定扫描表格更便宜,而不是在最佳索引(field, field2, id)与数据之间来回反射。

如果您想进一步讨论,请提供SHOW CREATE TABLE,0 SHOW TABLE STATUS,EXPLAIN SELECT ...,RAM的大小以及innodb_buffer_pool_size的值。

它闻起来像缓存和I/O问题;以上信息将有助于深入研究。