***** 一幅图说明 VARCHAR 之间的差别 *****
值
CHAR(4)
存储需求
VARCHAR
存储需求
‘‘
’ ‘
4个字节
‘‘
1个字节
’ab’
‘ab ‘
4个字节
‘ab’
3个字节
‘abcd’
‘abcd’
4个字节
‘abcd’
5个字节
‘abcdefgh’
‘abcd’
4个字节
‘abcd’
5个字节
生产环境创建表
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)), #<==括号内的32表示对前32个字符做前缀索引。
KEY `IDX_SUBJECT_TITLE` (`subject_title`(32))
KEY `index_nick_type` (`edit_user_nick`(32),`subject_type`)#<==联合索引,此行为新加的,用于给大家讲解的。实际表语句内没有此行。
) ENGINE=InnoDB AUTO_INCREMENT=1DEFAULT CHARSET=utf8;
创建索引
查看索引方法:
descstudent; ##大致查看
showindex from student; ##详细查看
showindex 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)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果在建表的时候,没有创建索引,可以使用alter来创建索引:
mysql> alter table student add primarykey(id);
查看:
mysql>desc student;

mysql> alter table student change id idint(4) auto_increment; #==》改为自增
2)创建普通索引:
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)
);
其它创建索引方法:
mysql> create index ind_dept onstudent(dept);
mysql> alter table student add indexindex_age(age);
删除索引:
mysql> alter table student drop indexind_dept;
针对前八个字符创建索引:
alter table student add indexindex_dept(name(8));
create index index_dept onstudent(dept(8));
###的内容很多,可以取列的一部分来创建索引。
3)创建联合索引:
多个列创建联合索引,唯一值更少,数据更精确。
create index ind_name_dept onstudent(name,dept);
create index ind_name_deptnew onstudent(name(8),dept(8)); ##根据前8个字符创建联合索引

mysql> select count(distinct host) frommysql.user; #查看列的唯一值数量

mysql> select distinct user frommysql.user; #查看有哪些唯一数值

4)创建唯一索引(多用于创建登录账号):
mysql> create unique indexuni_index_name on student(name);

问题1、既然索引可以加快查询速度,那么就给所有的列建索引吧?
解答:因为索引不但占用存储空间,而且更新数据时还需要维护索引数据的,因此,索引是一把双刃剑,并不是越多越好,例如:数十到数百行的小表上无需建立索引,插入更新频繁,读取比较少的表要尽量不建立索引。
问题2、需要在哪些列上创建索引才能加快查询速度呢?