`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秒。
是什么原因?
由于
答案 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>