Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5211642
  • 博文数量: 1004
  • 博客积分: 8199
  • 博客等级: 中将
  • 技术积分: 13042
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 20:19
个人简介

脚踏实地、勇往直前!

文章分类

全部博文(1004)

文章存档

2020年(1)

2019年(93)

2018年(208)

2017年(81)

2016年(49)

2015年(50)

2014年(170)

2013年(52)

2012年(177)

2011年(93)

2010年(30)

分类: Mysql/postgreSQL

2014-08-27 16:33:13


通常情况下我们对已经有索引的表加载大数据的情景下,先禁用索引,等待加载完成后在启用索引,如下
禁用索引
alter table tb_test disable keys;
加载完成后启用索引
alter table tb_test enable keys;

但是这种情况只能适用于非唯一性索引,唯一性索引是不管用的.
下面的方法通过重命名frm和MYI文件的方式快速创建索引(包括唯一性和非唯一性索引)

1.创建一个没有任何索引的表
CREATE TABLE `tb_dic_class_myisam` (
  `class_id` int(11) NOT NULL,
  `class_name` varchar(20) NOT NULL,
  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,
  `modifytime` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8

2.加载数据

我这里的insert_sql.sql是自己生成的,里面就是insert语句,读者可以自己根据情况加载数据
[mysql@node2 shell]$ time mysql -h node2 -uroot -D hxl -p
Enter password:

real    2m15.287s
user    0m10.397s
sys     0m9.032s


Database changed

加载记录数
mysql> SELECT COUNT(1) FROM tb_dic_class_myisam;
+----------+
| COUNT(1) |
+----------+
|  2000000 |
+----------+
1 row in set (0.00 sec)

3.创建有主键以及索引的表
CREATE TABLE `tb_dic_class_myisam_idx` (
  `class_id` int(11) NOT NULL,
  `class_name` varchar(20) NOT NULL,
  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,
  `modifytime` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`class_id`),
  KEY `idx_tb_dic_class_myisam_n1` (`class_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

这个使用在数据文件里会生成如下的两个文件
tb_dic_class_myisam_idx.frm
tb_dic_class_myisam_idx.MYI

4.用读取锁刷写该表
lock table tb_dic_class_myisam_idx read;

5.重命名有索引表的frm和myi文件
mv tb_dic_class_myisam_idx.frm tb_dic_class_myisam.frm
mv tb_dic_class_myisam_idx.MYI tb_dic_class_myisam.MYI

6.释放锁
unlock tables;

7.使用repair table创建表的索引
repair table tb_dic_class_myisam;

8.查看之前没有索引的表的结构
CREATE TABLE `tb_dic_class_myisam` (
  `class_id` int(11) NOT NULL,
  `class_name` varchar(20) NOT NULL,
  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,
  `modifytime` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`class_id`),
  KEY `idx_tb_dic_class_myisam_n1` (`class_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

可以看到该表上已经有主键和索引了,达到了快速创建索引的目的,整个操作速度是非常快的,不过有一定的风险,大家在操作的时候事先要备份好数据。

-- The End --

阅读(4265) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~