ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    MySQLのインデックスのデータ長は最大で64バイトだった

    このエントリーを含むはてなブックマーク はてなブックマーク - MySQLのインデックスのデータ長は最大で64バイトだった あとで読む
    MySQL5.0を使って、Amazonマーケットプレイスの商品データを保存した。
    インデックスを設定して使っていたが、予期せぬエラーが発生した。

    原因は、MySQLのインデックスの使い方が間違っていたことだった。
    =インデックスのデータ長は、最大で64バイトまでという制限があった。

    【追記 2013/02/07】
    コメント欄で、間違いをご指摘いただきました。
    「インデックス名」の長さが64バイトまで。「インデックスのデータ長」は64バイト以上でもOKとのこと。


    MySQLで学ぶデータベース超入門MySQLで学ぶデータベース超入門
    (2009/7/31)
    山田 祥寛

    商品詳細を見る


    データベースエラーが発生しました。
    Error Number: 1062
    Duplicate entry 'ABCDEFGHIK-rlBu7Xv5FOrBVWOgn5eYdxdC7s3TTAkwS0VnEeAvt0ghoimXiHIvE' for key 2



    UNIQUEなインデックスとして、100~200バイト程度の文字列(OfferListingId)を使っていたが、実際にインデックスとして使われている文字列は、先頭の64バイトまでだった。
    =65バイト以降の残りの部分はMySQLによってカットされていた。

    先頭の64バイトまでだと、極まれに重複が発生してしまい、UNIQUEなインデックスとして使える「固有値」にはなっていなかったと。
    =UNIQUEなインデックスは、一意にデータを特定するために、重複があってはいけない。

    ●MySQLのインデックスデータは最大64バイト
    MySQL 5.1 リファレンスマニュアル :: 8 言語構造 :: 8.2 識別子

    データベース、テーブル、インデックス、カラム、そしてエイリアスは識別子です。
    下記テーブルは各識別子の長さ(最長時)記しています。

    識別子最長(バイト)
    データベース64
    テーブル64
    カラム64
    インデックス64
    エイリアス255



    なるほど、こんな制限があったのか。知らんかった。
    MySQLのインデックスのデータ長は最大で64バイトまでだった。

    これはMySQLの仕様らしい。
    =設定値を変えるとか、コンパイルのオプションを変えるとか、では変更できないみたいだ。

    ●64バイト以下の固有値を用意する
    Amazonマーケットプレイスの商品データには、
    ・OfferListingId
    ・ExchangeId
    という識別値がある。
    しかし、Amazon.co.jpが販売している商品には、ExchangeIdがない。
    (=使っているAmazon APIのバージョンは、「2009-03-31」)

    なので、データ長がちょっと長いなーと思ったけど、ExchangeIdの代わりにOfferListingIdを使ってみたわけだ。
    ところがドッコイ、MySQLのインデックスにとって、OfferListingIdは長過ぎてエラーになってしまったと。

    ・仕方がないので、ExchangeIdをUNIQUEインデックスとして使う。
    ・ExchangeIdが無いAmazon.co.jpの商品は、ExchageIdの代用として、OfferListingIdをmd5でハッシュ値に変換した文字列(32バイト)を使ってみる。

    多分、AmazonではMySQLを使っていないような気がする…。

    Amazon SimpleDB - Wikipedia

    Amazon SimpleDBはAmazon.comによるErlangで記述された分散データベースである。
    Amazon Web Servicesの一部であり、Amazon Elastic Compute Cloud(EC2)とAmazon S3とともに使われるWebサービスである。



    EnterpriseDB、Amazon.comのホスティングサービスでデータベース製品を提供

    EnterpriseDBは、Oracleと互換のあるPostgreSQLベースの自社データベースを、新たにAmazon.comのホスティングサービスにポーティングする。
    Amazonはすでに、DBホスティングサービス「SimpleDB」を提供しているが、Zurek氏は自社データベースは大量のトランザクションやアプリケーションに対応できるよう設計されていると説明する。



    やっぱりなー、という感じ。

    XMLデータを保存しておく器は、MySQLじゃなくて、CouchDBの方が使いやすいんじゃないか!?と思う。
    =XMLをJSONに変換して、そのままCouchDBに突っ込んでおくだけ。
    後で試してみたい。
    関連記事

    コメント

    こちらですが、ちょっと誤解されているのではないかと思います。

    > データベース、テーブル、インデックス、カラム、そしてエイリアスは識別子です。
    > 下記テーブルは各識別子の長さ(最長時)記しています。

    これですが、「識別子」って、要するに「インデックス名」のことです。
    インデックス名が64バイトを越えられないということなので、
    インデックスのデータそのものが64バイトということではないです。

    ちなみに、ユニークキーは767バイトまでのようです。

    インデックス名とインデックスのデータの違い


    >通りすがりさん

    コメントどうもありがとうございます。
    MySQLのインデックスについて、間違いをご指摘いただき、助かりました。

    (1)インデックス名
    (2)インデックスのデータ
    の違いに注意!と。

    Amazonの商品データを放り込んでいたときのエラーは、データ長じゃなくて、他の原因だったのかな?
    あとで、実験して確認してみたいと思います。

    今後とも、当ブログをご愛読のほど、よろしくお願い申し上げます。


    > こちらですが、ちょっと誤解されているのではないかと思います。
    >
    > > データベース、テーブル、インデックス、カラム、そしてエイリアスは識別子です。
    > > 下記テーブルは各識別子の長さ(最長時)記しています。
    >
    > これですが、「識別子」って、要するに「インデックス名」のことです。
    > インデックス名が64バイトを越えられないということなので、
    > インデックスのデータそのものが64バイトということではないです。
    >
    > ちなみに、ユニークキーは767バイトまでのようです。

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/407-d5ed0ebb

    FC2Ad