0

私はアプリケーションを開発しており、プログラムからクエリ文字列を作成し、それを 4 つを含むストアド プロシージャに渡しますPrepared statements。変数を渡した後、ステートメントは次のようになります。

DROP TABLE IF EXISTS tbl_correlatedData;

CREATE TABLE tbl_correlatedData 
SELECT t0.*,t1.counttimeStamplocalIp,t2.countlocalPort,t3.countlocalGeo,t4.countisp,t5.countforeignip,t6.countforeignPort,t7.countforeignGeo,t8.countinfection 
FROM tbl_union_threats t0 
LEFT JOIN tbl_tsli t1 
USING (timeStamp,localIp) LEFT JOIN tbl_tslilp t2 USING (timeStamp,localIp,localPort) 
LEFT JOIN tbl_tslilplg t3 
USING (timeStamp,localIp,localPort,localGeo) 
LEFT JOIN tbl_tslilplgisp t4 
USING (timeStamp,localIp,localPort,localGeo,isp) 
LEFT JOIN tbl_tslilplgispfi t5 
USING (timeStamp,localIp,localPort,localGeo,isp,foreignip) 
LEFT JOIN tbl_tslilplgispfifp t6 
USING (timeStamp,localIp,localPort,localGeo,isp,foreignip,foreignPort) 
LEFT JOIN tbl_tslilplgispfifpfg t7 
USING (timeStamp,localIp,localPort,localGeo,isp,foreignip,foreignPort,foreignGeo) 
LEFT JOIN tbl_tslilplgispfifpfginf t8 USING (timeStamp,localIp,localPort,localGeo,isp,foreignip,foreignPort,foreignGeo,infection)
GROUP BY timeStamp,localIp;

ALTER TABLE tbl_correlatedData 
MODIFY timeStamp VARCHAR(200) NOT NULL, 
MODIFY localIp VARCHAR(200) NOT NULL, 
MODIFY localPort VARCHAR(200) NOT NULL, 
MODIFY localGeo VARCHAR(200) NOT NULL, 
MODIFY isp VARCHAR(200) NOT NULL, 
MODIFY foreignip VARCHAR(200) NOT NULL, 
MODIFY foreignPort VARCHAR(200) NOT NULL, 
MODIFY foreignGeo VARCHAR(200) NOT NULL, 
MODIFY infection VARCHAR(200) NOT NULL;

CREATE INDEX id_index ON tbl_correlatedData (timeStamp,localIp,localPort,localGeo,isp,foreignIp,foreignPort,foreignGeo,infection);

しかし、プロセスがインデックス作成クエリに到達すると、次のようなエラーが発生します。

Incorrect key file for table 'tbl_correlateddata'; try to repair it

参考までに: xampp サーバーのあるドライブに 19 GB の空き容量がある Windows Vista 32 ビットでこれを試しています。

編集:次 を使用して修復しようとするとREPAIR TABLE tbl_correlateddata

Table                                |  Op    | Msg_type |  Msg_text
-----------------------------------------------------------------------------------------------------------------
db_threatanalysis.tbl_correlateddata |  repair| Error    |  Table 'db_threatanalysis.tbl_correlateddata' doesn...
db_threatanalysis.tbl_correlateddata |  repair| status   |  Operation failed

助けてくれてありがとう..事前に:)

4

3 に答える 3

2

複合 (複数列) インデックスを作成しようとしていますが、これは Innodb には長すぎます。

各 VARCHAR(200) の 9 つの列があるため、合計インデックス幅は 1800 文字です。MySQL のドキュメントによると、Innodb キーは 3072 文字に制限されています。したがって、大丈夫なはずですが、ALTER TABLE ... MODIFY ...すべての列幅を 200 以下に減らすことができたという保証はないため、4000 文字のままでも、このエラーが発生します。

解決:

複合インデックスのフィールド数を減らします。この生成されたテーブルをクエリするクエリを分析し、本当に必要なインデックスのみを作成します。それらのほとんどは1列のインデックスになると思います。

また、タイムスタンプ、IP、ポートなどの単純なものを保存するために VARCHAR(200) が必要な理由はかなり奇妙です。おそらく、10 バイト以下に簡単に圧縮して、1 日と呼ぶことができます。

于 2013-01-07T08:17:45.233 に答える
2

鍵のサイズが長すぎる可能性があります。ローカルの MySQL インストールで同様のことを試しました。テーブルがないため、CREATE TABLE ステートメントを実行できませんでした。私のデータベースは UNICODE 用にセットアップされているため、キーのサイズは 4000 バイトを超えていました。MySQL InnoDB は、キー サイズが 3072 バイトのインデックスのみを作成できます。

私のコードは次のようになりました:

CREATE TABLE tbl_correlatedData 
(
  `timeStamp` VARCHAR(200) NOT NULL, 
   localIp VARCHAR(200) NOT NULL, 
   localPort VARCHAR(200) NOT NULL, 
   localGeo VARCHAR(200) NOT NULL, 
   isp VARCHAR(200) NOT NULL, 
   foreignip VARCHAR(200) NOT NULL, 
   foreignPort VARCHAR(200) NOT NULL, 
   foreignGeo VARCHAR(200) NOT NULL, 
   infection VARCHAR(200) NOT NULL
  );

CREATE INDEX id_index ON tbl_correlatedData
       (timeStamp,
        localIp,
        localPort,
        localGeo,
        isp,
        foreignIp,
        foreignPort,
        foreignGeo,
        infection
 );

これにより、次のエラーが発生しました。

Error Code: 1071. Specified key was too long; max key length is 3072 bytes

サイズ制限については、http: //dev.mysql.com/doc/refman/5.5/en/innodb-restrictions.htmlを参照してください。この問題があると思います。

于 2013-01-07T08:19:33.437 に答える
1

インデックス キー プレフィックスは、innodb テーブルでは最大 767 バイト、myisam テーブルでは約 1000 バイトです。

mysql innodb の合計インデックス長は 3072 です

ここでは、最初にインデックスの長さを確認し、可能であればすべての列のサイズを varchar(100) に減らします。

可能であれば、個別のインデックスを作成します(要件に合っている場合)

リンクを見る

http://dev.mysql.com/doc/refman/5.0/en//create-index.html

http://bugs.mysql.com/bug.php?id=6604

于 2013-01-07T09:37:47.827 に答える