mysql给大表增加索引

大表加索引

最近面试的时候有两次被问到大表增加索引怎么增加,流程说一说;

今天就爆肝整理一下:

表order有一千万数据,了我们给表order增加索引

看以下流程:

#操作步骤
#1、创建一张和原表结构一样的空表,只是表名不一样;
    create table tb_name_tmp like tb_name;

#2、把新建的空表非主键索引都删掉,因为这样在往新表导数据的时候效率会很快(因为除了必要的主键以外,不用再去建立其它索引数据了)
    alter tb_name_tmp drop index index_name;
#3、从旧表往主表里导数据,如果数据太大,建议分批导入,只需确保无重复数据就行,因为导入数据太大,会很占用资源(内存,磁盘io, cpu等),可能会影响旧表在线上的业务。我是每批次100万条数据导入,基本上每次都是在 20s左右;
    insert into tb_name_tmp select * from tb_name where id between start_id and end_id;
#4、数据导完后,再对新表进行添加索引;
create index index_name on tb_name_tmp(column_name);
#5、当大部分数据导入后,索引也建立好了,但是旧表数据量还是会因业务的增长而增长,这时候为了确保新旧表的数据一至性和平滑切换,建议写一个脚本,判断当旧表的数据行数与新表一致时,就切换。我是以 max(id)来判断的。
     table tb_name to tb_name_tmp1;
     table tb_name_tmp to tb_name;

### 如何在 MySQL 中为创建索引MySQL 中,可以通过多种方式为索引。以下是几种常见的方法: #### 使用 `CREATE INDEX` 创建索引 可以使用 `CREATE INDEX` 语句来单独为已存在的索引。语法如下: ```sql CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名称 ON 名 (列名[(长度)]); ``` 例如,如果要为名为 `tb_user` 的中的 `name` 字段创建普通索引,则执行以下命令[^1]: ```sql CREATE INDEX idx_name ON tb_user(name); ``` #### 在创建时定义索引 当创建新时,可以在 `CREATE TABLE` 语句中直接指定索引。这通常是最简便的方式之一。例如,在创建的同时为主键字段设置索引以及为其他字段设置普通索引[^2]: ```sql CREATE TABLE tb_user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', name VARCHAR(50), age INT, INDEX idx_name (name) ); ``` 此操作会自动为主键 `id` 设置唯一索引,并且还为 `name` 字段设置了普通的非唯一索引。 #### 添单个或多个列组成的复合索引 除了单一列上的索引外,还可以通过组合多个列形成复合索引。这样做的好处是可以提高涉及这些列联合查询的速度。下面展示了一个例子,其中我们将两个字段一起作为复合索引的一部分[^1]: ```sql ALTER TABLE tb_user ADD INDEX idx_composite (age, name); ``` 或者也可以在建的时候就声明这样的复合索引[^2]: ```sql CREATE TABLE tb_user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键', name VARCHAR(50), age INT, INDEX idx_composite (age, name) ); ``` 以上就是关于如何在 MySQL 中为现有增加各种类型的索引的一些介绍。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值