1. 程式人生 > >mysql百萬的資料快速建立索引

mysql百萬的資料快速建立索引

測試資料本機一張表users有100百萬條記錄。在建立此表前沒有未相應欄位新增索引,所以此時需要為表新增索引。但是因為資料量大的原因,索引新增可能不成功,想了很多辦法,終於挖坑成功。

開始準備工作,

user表結構:

複製程式碼
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中使用 into outfile匯出資料的時候出現錯誤:

select * from users into outfile 'users.txt'; //users.txt檔案在mysql的dat

如下圖:

上網查了一下是mysql設定的許可權,可以使用

show variables like '%secure%';檢視 secure-file-priv 當前的值是什麼?

可以看到secure-file-priv引數是用來限制LOAD DATA, SELECT ... OUTFILE, and 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所以再嘗試修改mysql.cnf中的[mysqld]加入secure_file_priv = 最終如下:再次重啟mysql

可以看到users.txt生成在同級test資料庫目錄。。。
接著執行:

truncate  users;

建立索引:

create index name using BTREE on
users(name);

索引的方式有:BTREE、RTREE、HASH、FULLTEXT、SPATIAL,這裡不再贅述他們的區別,網上有很多關於這塊的介紹啦

匯入檔案到相應表users。

load data infile 'users.txt' into table users;

此方式在write 鎖住情況下,或對外服務暫停時使用,線上不可能直接這樣玩了。。