MySQL-索引

MySQL在创建数据表的时候创建索引
在MySQL中创建表的时候,最好顺便创建索引。

基本的语法格式如下:
CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
                  [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
                  [索引名](字段名1 [(长度)] [ASC | DESC])
);


UNIQUE:可选。表示索引为唯一性索引。
FULLTEXT;可选。表示索引为全文索引。
SPATIAL:可选。表示索引为空间索引。
INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。
索引名:可选。给创建的索引取一个新名称。
字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。
长度:可选。指索引的长度,必须是字符串类型才可以使用。
ASC:可选。表示升序排列。
DESC:可选。表示降序排列。

 

查看默认索引:SHOW index from student\G;


索引就象书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度,但是会影响更新的速度。

 

1、为表字段创建索引
创建主键索引
查询数据库,按主键查询是最快的,每个表只能由一个主键列,但是可以有多个普通索引列。主键列要求列的内容必须唯一,而索引列不要求内容必须唯一。
create table student(
id int(4) not null AUTO_INCREMENT,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default null,
PRIMARY KEY(id),
KEY index_name (name)
)
AUTO_INCREMENT=1000;

提示:
1、primary key(id) 为主键
2、KEY index_name (name) 字段普通索引(在name列上添加索引,索引名为index_name,索引名可以自己取)
优化:在唯一值多的列上创建索引查询效率高。

提示:PRI为主键索引,MUL为普通索引

 

2、建表之后通过alter命令增加id列为主键索引(不建议这样做,一般都在建表时就加上主键)
alter table student change id id int primary key auto_increment;

删除指定表的主键
alter table test_table drop primary key;
这里有个情况需要指出,如果该主键列是自动增长(auto_increment)的,因为mysql要求自动增长列必须是索引,所以删除主键也就删除了主键索引,这是不符合mysql要求的,是无法实现的,因为设置了自增会报错,必须先删除自动增长alter table student change id id int(4) unsigned not null;(通过修改列属性),后删除主键

创建普通索引
(两种方法)
(在name列上添加索引,索引名为index_name)
alter table student add index index_name(name);
create index index_name on student;

删除普通索引
(两种方法)
alter table student drop index index_name;
drop index index_name on student;

 

3、根据字段的前n个字符创建普通索引
当遇到表中比较大的列时,列内容的前n个字符在所有内容中已经接近唯一时,这时可以对列的前n个字符建立索引,而无需对整个列建立索引,这样可以节省创建索引占用的系统空间,以及降低读取和更新维护索引消耗的系统资源
在student表dept列的前8个字符上创建索引
create index index_dept on student(dept(8));
alter table student add index index_dept(dept(8));


4、根据表的多个字段创建联合索引
如果查询数据的条件时多列时,我们可以为多个查询的列创建联合索引,甚至可以为多列的前n个字符创建联合索引;
给student表的name和dept列创建联合索引
create index index_name_dept on student(name,dept);
create index index_name_dept on student(name(8),dept(10));

建表语句加入联合索引:某sns产品生产正式建表语句:
create table subject_comment_manager(
subject_comment_manager_id bigint(12) not null auto_increment COMMENT'主键',
subject_type tinyint(2) not null COMMENT '素材类型',
subject_primary_key varchar(255) not null COMMENT '素材主题',
subject_title varchar(255) not null COMMENT '素材的名称',
edit_user_nick varchar(64) default null COMMENT '修改人',
edit_user_time timestamp null default null COMMENT '修改时间',
edit_comment varchar(255) default null COMMENT '修改的理由',
state tinyint(1) not null default'1' COMMENT '0代表关闭,1代表正常',
PRIMARY KEY (subject_comment_manager_id),
KEY IDX_PRIMARYKEY (subject_primary_key(32)),
KEY IDX_SUBJECT_TITLE (subject_title(32)),
KEY index_nick_type (edit_user_nick(32),subject_type)#为了练习联合索引自加的
)AUTO_INCREMENT=1 CHARSET=utf8;
提示:按条件列查询数据时,联合索引时有前缀生效特性的
index(a,b,c)仅a,ab,abc三个查询条件列可以走索引。


5、创建唯一非主键索引
create unique index uni_index_age on student(age);
提示:唯一非主键的索引标识就是UNI.

 

6、索引的创建及生效条件
索引可以加快查询速度,是否可以给所有列创建索引?
答:索引不但占用系统空间,更新数据库时还需要维护索引数据,因此所以是一把双刃剑。
例如:数十到几百行的小表上无需建立索引,更新频繁,读少的业务要少建立索引。
到底在哪些列上创建索引呢?
答:select user,host from mysql.user where host=...,索引一定要创建在条件列,而不是select后的选择数据的列。
另外我们要尽量选择在唯一值多的大表上建立索引。

 

mysql 中如何给已存在的表中字段增设置主键
把表里面的数据备份到另外一张表里面 create table table2 as select * from table1;
然后把表里的所有记录删除 delete from table1;
-添加主键id
alter table student add primary key(id);
将备份数据导回原表
INSERT INTO table1 SELECT * FROM table2 ;

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据库)