0
`SELECT r.*, u.username 
FROM `reservation` AS r JOIN 
     `users` AS u 
WHERE u.id = r.user_id 
AND   DATE(r.bx_date) >= DATE('2012-08-22') 
AND   DATE(r.bx_date) <= DATE('2012-08-22') 
AND   r.status='1' 
ORDER BY r.id desc`

表预留包含 500,000 条记录,bx_date 从 2012-01-01 到 2013-01-01 变化。users 表中有 40,000 条记录。bx_date 是“日期”类型。

使用上面的查询,如果我尝试像 2012-08-22 这样的日期,则需要 8 秒。但是,如果我尝试 2013-01-01 大约需要 1 秒。

是什么原因 ?

谢谢

4

3 回答 3

2

最可能的原因是不正确的索引或索引维护。

您应该有一个索引,例如:

CREATE INDEX reservation_ndx ON reservation
    (status, bx_date, user_id)

另外,如果使用 InnoDB,请尝试运行

ANALYZE TABLE reservation;

为了让系统更新表格人口统计。

另一个可能(但恕我直言不太可能)的原因可能是表分区:

 http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html

眼见为实reservation可能会随着时间的推移而逐渐填满。

更新:我没有提到明显的原因,一个查询可能会返回一百万条记录,而另一个查询会立即失败,但是如果您不知道 SQL 结果是什么(也许您只是在运行“盲目”基准测试和只检查执行时间),这也可能是一种可能性。(更新更新:我刚刚读到两个查询都返回相同的行数。然后排除了这个原因

于 2012-08-22T11:03:05.617 回答
0

截至今天('2012-08-22')的数据在您的餐桌预订中可用。但是,找不到 2013 年的数据。数据可用性导致了这种变化。

于 2012-08-22T10:57:27.903 回答
0
<table id="table_results" class="data ajax">
<thead><tr>
<th class="draggable">id
</th><th class="draggable">select_type
</th><th class="draggable">table
</th><th class="draggable">type
</th><th class="draggable">possible_keys
</th><th class="draggable">key
</th><th class="draggable">key_len
</th><th class="draggable">ref
</th><th class="draggable">rows
</th><th class="draggable">Extra
</th></tr>
</thead>
        <tbody>
<tr class="odd"><td align="right" class="data grid_edit not_null    nowrap ">1</td>
<td  class="data grid_edit not_null    ">SIMPLE</td>
<td  class="data grid_edit     ">r</td>
<td  class="data grid_edit     ">range</td>
<td  class="data grid_edit     ">bx_date_index</td>
<td  class="data grid_edit     ">bx_date_index</td>
<td  class="data grid_edit     ">3</td>
<td  class="data grid_edit      null"><i>NULL</i></td><td align="right" class="data grid_edit     nowrap ">3725</td>
<td  class="data grid_edit not_null    ">Using where; Using filesort</td>
</tr>

<tr class="even"><td align="right" class="data grid_edit not_null    nowrap ">1</td>
<td  class="data grid_edit not_null    ">SIMPLE</td>
<td  class="data grid_edit     ">u</td>
<td  class="data grid_edit     ">eq_ref</td>
<td  class="data grid_edit     ">PRIMARY</td>
<td  class="data grid_edit     ">PRIMARY</td>
<td  class="data grid_edit     ">4</td>
<td  class="data grid_edit     ">db.r.user_id</td>
<td align="right" class="data grid_edit     nowrap ">1</td>
<td  class="data grid_edit not_null    ">Using where</td>
</tr>

</tbody>
</table>
于 2012-08-22T13:09:37.350 回答