おそらく、url
カラムを TEXT型で定義していることが問題です。
MySQLには、以下のような制限があるからです。
- TEXT型にはプリフィクスインデックスしか作成できない
https://dev.mysql.com/doc/refman/5.6/ja/column-indexes.html
BLOB または TEXT カラムにインデックス設定する場合、インデックスのプリフィクス長を指定する必要があります。
- プリフィックスインデックスは GROUP BY句で使用できない
https://dev.mysql.com/doc/refman/5.6/ja/group-by-optimization.html#loose-index-scan
インデックス内のカラムの場合、プリフィクスだけでなく、完全なカラム値にインデックスが設定されている必要があります。たとえば、c1 VARCHAR(20), INDEX (c1(10)) では、インデックスはルースインデックススキャンに使用できません。
実際、TEXT型のままインデックスを作成しても、それは使用されません。
http://sqlfiddle.com/#!9/001bc0/1
というわけで、以下のようにurl
カラムの型を VARCHAR型に変更し、さらにインデックスを作成してやると、高速化が見込めます。
sql
1ALTER TABLE urls
2 CHANGE COLUMN url url VARCHAR(255),
3 ADD INDEX (url);
http://sqlfiddle.com/#!9/6decfc/3
なお、url
カラムに他の属性(例えば NOT NULL など)もある場合、ALTER TABLE 文では以下のようにそれら全ての属性を含めてやる必要があります。
sql
1ALTER TABLE urls
2 CHANGE COLUMN url url VARCHAR(255) NOT NULL ...,
3 ADD INDEX (url);
https://dev.mysql.com/doc/refman/5.6/ja/alter-table.html
CHANGE または MODIFY を使用する場合は、column_definition に、データ型および PRIMARY KEY や UNIQUE などのインデックス属性以外の、新しいカラムに適用されるすべての属性を含める必要があります。元の定義には存在するが、新しい定義として指定されていない属性は引き継がれません。
ちなみに、VARCHAR型に変更する際は格納できる文字数を指定してやる必要がありますが、
もし、url
カラムに格納されているデータが質問欄にご提示の通りの「ドメイン」のみなのであれば、255文字で十分です。
https://ja.wikipedia.org/wiki/%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D#.E6.9C.89.E5.8A.B9.E3.81.AA.E3.83.9B.E3.82.B9.E3.83.88.E5.90.8D.E3.81.AE.E5.88.B6.E9.99.90
すべてのラベルを結合しドメイン名を構成したとき、その最大文字数は255文字以下であると言う制限がある。