質問: MySQL(5.6)でデータの挿入バッチ作業をやってます 仮に以下のようなurlsテーブルがあったとして | url | count | | --- | --- | | yahoo.co.jp | 2 | | google.com | 9 | | yahoo.co.jp | 3 | これをurlでGROUP BYしてかつcountの合計値とりたいので ``` select url, SUM(`count`) AS count_sum from urls group by url ``` でやってます。 もちろんこのぐらいの量なら問題ないのですが、すでにurlsテーブルに数百万件のデータが入っているので結構遅いです。 urlでINDEXキー?貼っても効いてくれませんでした バッチなのでクエリの実行回数自体はそんなに多くはないのですが、なにか改善点はございますでしょうか。 よろしくお願いいたします。
回答: このテーブルにカラムを追加してよいのであれば、URLのハッシュ値を生成して、ハッシュ値でGROUP BYしてみるのはどうでしょうか。 別テーブルを作ってよいのであれば、URLをユニークにした一覧テーブルを作成し、そのテーブルのIDをこのテーブルに持たせ、そのIDでGROUP BYすれば衝突もないでしょう。 ### 追記 基本的にTEXT型はINDEXを貼ったり条件に使ったりするのは苦手で低速なので、最大長がわかっていて、VARCHAR型にすることができるのであれば型を変えることもおすすめします。