在表格中间取一行

时间:2012-08-22 10:24:24

标签: mysql sql phpmyadmin mysqli

`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之间有所不同。用户表中有40,000条记录。 bx_date是'日期'类型。

如果我尝试了像2012-08-22这样的日期,那么上面的查询需要8秒。但如果我尝试2013-01-01需要1秒。

是什么原因?

由于

3 个答案:

答案 0 :(得分: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结果是什么(也许你只是在运行'盲'基准并且只检查执行时间),这也可能是一种可能性。 (更新时更新:我刚刚读到两个查询都返回相同的行数。然后排除了这个原因

答案 1 :(得分:0)

截至今天('2012-08-22'),您的餐桌预订中提供了数据。但是,没有找到2013年的数据。数据可用性会带来这种变化。

答案 2 :(得分: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>