xiaoyh 的个人博客

一个只会敲代码的咸鱼

0%

SQL 进阶(3)

索引

索引可以大大提高 SQL 的检索速度,用户无法看到索引,它们只能被用来加速搜索/查询。

拿汉语字典打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

建立索引会占用磁盘空间的索引文件。所以,虽然索引提高了查询速度,但同时也会降低更新表的速度。因为更新表时,MySQL 不仅要保存数据,还要保存索引文件。

单列索引

单列索引(也叫普通索引)基于单一的字段创建,其基本语法如下所示:

1
2
3
4
5
6
7
8
-- 创建索引
create index index_name on table_name(col_name);

-- 修改表结构(添加索引)
alter table table_name add index index_name(col_name);

-- 删除索引
drop index [index_name] on table_name;

唯一索引

唯一索引不允许索引列拥有相同的值。其基本语法如下所示:

1
create unique index index_name on table_name(col_name);

组合索引

组合索引在两个或更多的列的基础上建立:

1
create index index_name on table_name(col1, col2, ...);

组合索引也可以是唯一索引,表示组合索引的组合不能重复。

临时表

临时表顾名思义,是一个临时的表,数据库一般不会将其序列化到磁盘上而是存于内存中,在使用完之后就会销毁。

临时表分为两种:会话临时表和全局临时表,区别在于可用的作用域和销毁的时机不同。

会话临时表只在当前会话(连接)内可用,且在当前会话结束(断开数据库连接)后就会销毁;

全局临时表创建后,在销毁之前所有用户都可以访问,销毁的时机是在创建该临时表的连接断开且没有其他会话访问时才销毁。

当然有时考虑到内存占用的问题,也可以手动销毁临时表。

临时表实例

以 MySQL 为例,MySQL 中只有会话临时表,创建临时表的命令如下:

1
2
3
create temporary table table_name(
...
);

使用临时表(如查询)的操作与业务表一样,若临时表和业务表同名时,在该会话中会使用临时表。

若想手动删除临时表,可使用 DROP TABLE 命令。为避免临时表名和业务表名相同时导致误删除,可以加上 TEMPORARY 关键字:

1
drop [temporary] table table_name;

复制表

若想复制表的数据,有以下的语句可使用:

INSERT INTO SELECT 语句

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

1
2
3
4
5
6
7
-- 把 table1 的数据插入到 table2
insert into table2
select * from table1;

-- 也可以只复制指定的列插入到另一个已存在的表
insert into table2(col1, col2)
select col1, col2 from table1;

SELECT INTO 语句(MySQL 不支持)

SELECT INTO 从一个表复制数据,然后插入到另一个表中。

1
2
3
4
5
-- 把 table1 的数据复制到 table2
select * into table2 from table1;

-- 也可以只复制指定的列插入到另一个已存在的表
select col1, col2 into table2 from table1(col1, col2);