运维必会之MySQL篇 (3)

*****  一幅图说明 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篇

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篇

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

 

运维必会之MySQL篇

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

运维必会之MySQL篇


 
4)创建唯一索引(多用于创建登录账号):

mysql> create unique indexuni_index_name on student(name);

运维必会之MySQL篇


 
问题1、既然索引可以加快查询速度,那么就给所有的列建索引吧?

解答:因为索引不但占用存储空间,而且更新数据时还需要维护索引数据的,因此,索引是一把双刃剑,并不是越多越好,例如:数十到数百行的小表上无需建立索引,插入更新频繁,读取比较少的表要尽量不建立索引。

 
问题2、需要在哪些列上创建索引才能加快查询速度呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzyzj.html