テストデータは、1億レコードを持つローカルテーブルユーザーです。このテーブルを作成する前には、対応するフィールドにインデックスが追加されていないため、この時点でテーブルにインデックスを追加する必要があります。しかし、データ量が多いため、インデックスの追加がうまくいかない可能性があり、いろいろ考えた結果、穴を掘ることに成功しました。
準備作業を開始します。
ユーザーテーブル構造:
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `add_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
navicatでデータをエクスポートするためにoutfileに使用しようとしたときにエラーが発生しました:
select * from users into outfile 'users.txt'; //users.txt文件在mysql的dat
以下に示すように:
オンラインで確認しましたこれは mysql 設定の権限です。'%secure%' のような変数を表示すると、secure-file-priv の現在の値がわかります。制限 LOAD DATA、SELECT... OUTFILE、および LOAD_FILE() は、指定されたディレクトリに渡されます。 secure_file_priv の値が null の場合、mysqld のインポートとエクスポートが制限されていることを意味します。 secure_file_priv の値が /tmp/ の場合、mysqld のインポートとエクスポートは /tmp/ ディレクトリでのみ実行できることを意味します。 secure_file_priv の値には特定の値がありません。これは、mysqld のインポート/エクスポートに制限がないことを意味します。
エクスポートされるデータは、エクスポートされる前にこの値の指定されたパスである必要があります。デフォルトは NULL である可能性があります。 (ここで見ているのは null です)、これはエクスポートが禁止されていることを意味するため、設定する必要があります私は phpstudy を使用しているため、mysql インストール パスの下の my.ini ファイルにパスを設定します:
注: パス名 "" に二重引用符を追加してください
再起動して再度実行してもエラーは同じままです...
このパラメータは mysql.cnf に設定されていません。つまり、このパラメータはデフォルトで null ですを追加してみます。最終結果は次のようになります。
それがわかりますusers.txt は、同じレベルのテスト データベース ディレクトリに生成されます。 。 。次に実行します: 创建索引: 索引的方式有:BTREE、RTREE、HASH、FULLTEXT、SPATIAL,这里不再赘述他们的区别,网上有很多关于这块的介绍啦 导入文件到相应表users。 此方式在write 锁住情况下,或对外服务暂停时使用,线上不可能直接这样玩了。 相关推荐:truncate users;
create index name using BTREE on users(name);
load data infile 'users.txt' into table users;
以上がmysql により、数百万のデータのインデックスを迅速に作成できるようになりますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。