2010-08-27 107 views
0

我使用索引的MySQL表。Expain“解释”的查询结果在MySQL

我的查询是这样

EXPLAIN SELECT * FROM `logs` WHERE userId =288 AND dateTime BETWEEN '2010-08-01' AND '2010-08-27' 

我对现场用户id索引此表的日志, 并解释查询的结果是类似下面。

id select_type  table  type possible_keys key  key_len  ref  rows Extra 
1  SIMPLE   logs  ref  userId  userId  4  const 49560 Using where 

的问题是“我的索引是真正有用或没有?” ......提前

感谢

@fastmultiplication

我认为双方本场索引可能会增加加载在mysql上,因为将会有很多条目具有唯一的(userId和dateTime)。 我已经尝试添加两个userId_dateTime索引和结果是

id select_type  table type possible_keys   key  key_len  ref  rows Extra 
1  SIMPLE  logs ref  userId_dateTime userId_dateTime  4  const 63455 Using where 

回答

2

您的查询使用索引,是的,他们是有用的。您可能会发现下面的文档页面有用:

EXPLAIN Output Format
How MySQL Uses Indexes
Multiple-Column Indexes

另外:

Multiple column index vs multiple indexes

的MySQL通常会使用返回的行数最少的索引。在你的第一个例子中,MySQL使用userId指数的行数缩小到49560.这意味着,userId不包含唯一值(如果它没有,你就不需要日期范围条件)。由于dateTime列中没有索引,因此必须扫描每一行才能找到符合日期范围条件的索引。

在第二个示例中,您似乎在userIddateTime上创建了复合(多列)索引。在这种情况下,似乎MySQL无法使用BETWEEN子句—的后半部分索引我不确定原因。可能值得用两个单独的索引来尝试它,而不是多列索引。你也可以试试用替换BETWEEN

'2010-08-01' >= AND <= '2010-08-27' 

这应该是相同的,但看到下面的错误报告,这可能会影响你的MySQL版本:

Optimizer does not use index for BETWEEN in a JOIN condition

1

从“行”现场看起来像MySQL仍然估计将要看看很多行。

你应该尝试添加索引的日期时间字段,太。

而对于这个特定的查询,也许在两个领域的指标。

alter table logs add index user_datetime (userId,dateTime); 
+0

我已经进入详细有问题,请检查 – 2010-08-27 07:04:19

0

多少行应该查询回报?查询运行速度有多快?

它看起来对我来说,一个非常简单的查询,它使用的是正确的索引,所以如果是因为某些原因慢,这可能是因为它实际上返回大量的数据。如果您对所有行没有兴趣,可以使用LIMIT获取更少。