2010年3月25日

[mysql 15226] Re: レコードの存在チェック

宮田と申します。

> count(*) を行った場合、テーブルスキャンが発生するため、データ量によっては結果取得に時間を要します。

誤解される場合があると思いましたので、横からフォロー致します。

一般的にはテーブルスキャンは全表検索(全行検索)の意味で使われます。
よって、索引が設定された項目を条件に指定したcount(*)ではテーブルスキャンは

行われません。

ご案内頂いたURLでは、InnoDBの主キーがクラスタインデックスであり、
クラスタインデックスを走査する事をテーブルスキャンと表記している
場合があるようですが、一部の行のみを走査する場合にテーブルスキャンと
表記するのは誤用だと思います。

count(*)ではなくcount(カラム名)とするのは、条件との関連で使用できる
索引がなく、本来の意味のテーブルスキャン(=全表検索)が行われる際に、
主キーではない索引でテーブルスキャンを行わせたい場合に使います。
(その方が高速に動作する場合。行サイズの関連で大抵はそうなると思います)

> From: Akio Imai <suzuro2045@xxxxx>
> Subject: [mysql 15223] Re: [mysql 15221] Re: レコードの存在チェック
> Date: 2010/03/25 12:26
>
> 今井と申します。
>
> もう既に解決したような感じですが
> count(*) を行った場合、テーブルスキャンが発生するため、データ量によっては結果取得に時間を要します。
>
> InnoDB における count() の注意事項と高速化手法に関して書かれている記事があるので、以下を一読してみるだけでも面白いですよ
> http://nippondanji.blogspot.com/2010/03/innodbcount.html


投稿者 xml-rpc : 2010年3月25日 13:20
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/94492
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。