一篇文章带你深入了解 MySQL 索引相关,linux 视频教程下载
辅助索引的树最底层的叶子节点并不会存储一整行记录,而是只存储单列索引的数据,并且还存储了聚集索引的信息。
通过辅助索引进行查询时,先拿到自身索引字段的数据,再通过聚集索引拿到整行记录,也就是说辅助索引拿一整行记录而言需要最少两次查询。
而一张数据表中可以有多个辅助索引。
创建索引
========
索引类型
========
索引名类型 INDEX(field)普通索引,只加速查找,无约束条件 PRIMARY KEY(field)主键索引,加速查找,非空且唯一约束 UNIQUE(field)唯一索引,加速查找,唯一约束 INDEX(field1,field2)联合普通索引 PRIMARY KEY(field1,field2)联合主键索引 UNIQUE(field1,field2)联合唯一索引 FULLTEXT(field)全文索引 SPATIAL(field)空间索引
举个例子来说,比如你在为某商场做一个会员卡的系统。
这个系统有一个会员表有下列字段:会员编号 INT
会员姓名 VARCHAR(10)
会员身份证号码 VARCHAR(18)
会员电话 VARCHAR(10)
会员住址 VARCHAR(50)
会员备注信息 TEXT
那么这个 会员编号,作为主键,使用 PRIMARY
会员姓名 如果要建索引的话,那么就是普通的 INDEX
会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)
除此之外还有全文索引,即 FULLTEXT
会员备注信息如果需要建索引的话,可以选择全文搜索。用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
但其实对于全文搜索,我们并不会使用 MySQL 自带的该索引,而是会选择第三方软件如 Sphinx,专门来做全文搜索。
其他的如空间索引 SPATIAL,了解即可,几乎不用
各个索引的应用场景索引定义
语法介绍
========
索引应当再建立表时就进行创建,如果表中已有大量数据,再进行创建索引会花费大量的时间。
-- 方法一:创建表时
CREATE TABLE 表名 (
字段名 1 数据类型 [完整性约束条件…],
字段名 2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [索引名] (字段名[(长度)] [ASC |DESC]) );-- 方法二:CREATE 在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
-- 方法三:ALTER TABLE 在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SP
ATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ; -- 删除索引:DROP INDEX 索引名 ON 表名字;
功能测试
========
-- 准备表,注意此时表没有设置任何类型的索引
create table s1(
id int,
number varchar(20)
);
-- 创建存储过程,实现批量插入记录 delimiter
create procedure auto_insert1()
BEGIN
declare i int default 1; -- 声明定义变量
while(i < 1000000) do
insert into s1 values
(i,concat('第', i, '条记录'));
set i = i + 1;
end while;
END $$ -- 存储过程创建完毕 delimiter ;-- 调用存储过程,自动插入一百万条数据 call auto_insert1();
在无索引的情况下,查找 id 为 567891 的这条记录,耗时 0.03s
mysql> select * from s1 where id = 567891;
+--------+--------------------+| id | number |+--------+--------------------+| 567891 | 第 567891 条记录 |
评论