目录
一、索引的概念
二、索引的作用
三、索引的副作用
四、创建索引的规则
1、适合创建为索引的字段的规则
2、MySQL的优化 哪些字段/场景适合创建索引,哪些不适合
五、索引的分类和创建
1、索引的分类
2、三种创建方式
3、索引的创建演示
1、创建普通索引
(1)直接创建索引
(2)通过修改表结构创建索引
(3)通过创建表的方法创建普通索引
2、唯一索引
(1)直接创建唯一索引
(2)创建表的时候创建唯一索引
(3)通过修改表结构创建唯一索引
3、主键索引
(1)创建主键索引
(2)通过修改表结构添加主键索引
4、组合索引
(1)创建组合索引
5、全文索引
(1)创建表的时候创建全文索引
(2)直接创建全文索引
(3)修改表结构方式创建
6、查看索引
方法一
方法二
7、删除索引
方法一:直接删除
方法二:通过修改表的方式删除索引
方法三:删除主键索引
索引是一个排序的列表,再这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。
使用索引进行操作和使用select等语句直接进行查询的区别:使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址直接访问相应的数据,因此能加快数据库的查询速度。但是其他操作语句需要扫描全表后再进行相应操作。
总结:索引就是一种帮助系统能更快速的查询信息的结构,可以通过物理地址直接进行查找,而不需要扫描全表再进行操作。
(1)设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建 索引的最主要的原因。
(2)当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
(3)可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
(4)通过创建唯一(键)性索引,可以保证数据表中每一行数据的唯一性。
(5)可以加快表与表之间的连接。
(6)在使用分组和排序时,可大大减少分组和排序的时间。
(1)索引需要占用额外的磁盘空间。
对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
而 InnoDB 引擎的表数据文件本身就是索引文件。
(2)在插入和修改数据时要花费更多的时间,因为索引也要随之变动。
索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
(1)表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位
(2)记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
(3)经常与其他表进行连接的表,在连接字段上应该建立索引。
(4)唯一性太差的字段不适合建立索引。
(5)更新太频繁地字段不适合创建索引。
(6)经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
select name,score from ky19 where id=1
(7)索引应该建在选择性高的字段上。
(8)索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。
id type score zhusang(txt) page blog
(1)小字段
(2)唯一性强的字段
(3)更新不频繁,但查询率很高的字段
(4)表记录超过300+行
(5)主键、外键、唯一键
(1)普通索引
针对所有字段,没有特殊的需求和规则
(2)唯一索引
针对唯一的字段,仅允许出现一次空值
(3)组合索引
以 多列/多字段 组合的形式的索引,按照排序的顺序,否则无效
(4)主键索引
针对唯一字段,且不可为空,同时一张表只允许包含一个主键索引
(5)全文索引
varchar char text blog clob 以这些字段检索内部信息来做字段的索引
(1)创建索引并且指向索引的字段
(2)alter修改表结构的时候添加add 添加index
(3)创建表的时直接创建索引
ps:主键索引--->直接创建主键即可
格式:
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
示例:
create index phone_index on yyy (phone);
#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“_index”结尾,可以自定义。
格式:
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
示例:
create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test; #查看表结构
格式:
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
示例:
create table test(id int(4) not null,name varchar(10) not null,cardid varchar(18) not null,index id_index (id));
show create table test;
格式:
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
示例:
create unique index address_index on yyy (address);
create unique index name_index on yyy (name);
show create table yyy;
格式:
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));
示例:
create table amd2 (id int,name varchar(20),unique id_index (id));
show creat table amd2;
格式:
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
示例:
alter table yyy add unique cardid_index (cardid);
格式:
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
示例:
create table test1 (id int primary key,name varchar(20));
create table test2 (id int,name varchar(20),primary key (id));
show create table test1;
show create table test2;
格式:
ALTER TABLE 表名 ADD PRIMARY KEY (列名);
示例:
alter table yyy add primary key(name);
格式:
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
示例:
create table amd1 (id int not null,name varchar(20),cardid varchar(20),index index_amd (id,name));
show create table amd1;
insert into amd1 values(1,'zhangsan','123123');
insert into amd1 values(1,'zhangsan','123123');
格式:
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
示例:
create table auth2.test14(uid int(5) not null.uname char(5) not null,major char(10) not null,grade int(2) not null,score decimal(5,2) not null,addition char(10) default '无',fulltext index fen(uname),primary key(uid));
格式:
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
示例:
create fulltext index remark_index on member (remark);
格式:
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
示例:
alter table ky30 add fulltext xingming(name);
格式:
show index from 表名;
show index from 表名\G; #竖向显示表索引信息
示例:
show index from yyy;
show index from yyy\G; #竖向显示表索引信息
格式:
show keys from 表名;
show keys from\G 表名; #竖向显示索引信息
示例:
show keys from yyy;
show keys from yyy\G; #竖向显示索引信息
格式:
DROP INDEX 索引名 ON 表名;
示例:
drop index name_index on member;
格式:
ALTER TABLE 表名 DROP INDEX 索引名;
示例:
alter table member drop index id_index;
show index from member;
格式:
ALTER TABLE 表名 DROP PRIMARY KEY;
示例:
alter table yyy drop primary key;