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は、おそらく時間とともに徐々に満たされます。

更新: 1 つのクエリが 100 万件のレコードを返し、もう 1 つのクエリが即座に失敗する可能性があるという明らかな原因については言及していませんでしたが、SQL の結果が何であるかがわからない場合 (おそらく、「ブラインド」ベンチマークを実行しているだけで、実行時間のみを確認します)、それも可能性があります。(更新時に更新:両方のクエリが同じ数の行を返すことを読みました。この原因は除外されます)

于 2012-08-22T11:03:05.617 に答える
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 に答える
0

データは、今日( '2012-08-22')までのテーブル予約で利用できます。ただし、2013年のデータは見つかりません。データの可用性により、この変更が行われます。

于 2012-08-22T10:57:27.903 に答える